标签:pre parent blog str 基本 程序 完全二叉树 size create
树的基本概念
(1)树(Tree)的概念:树是一种递归定义的数据结构,是一种重要的非线性数据结构。树可以是一棵空树,它没有任何的结点;也可以是一棵非空树,至少含有一个结点。
(2)根(Root):有且仅有一个结点的非空树,那个结点就是根。
(3)子树(Subtree):在一棵非空树中,除根外,其余所有结点可以分为m(m≥0)个互不相交的集合。每个集合本身又是一棵树,称为根的子树。
(4)结点(Node):表示树中的元素及若干指向其子树的分支。
(5)结点的度(Degree):一个结点拥有的子树数目称为该结点的度。
(6)叶子结点(Leaf):度为0的结点。
(7)孩子(Child):结点子树的根称为该结点的孩子。
(8)双亲(Parents):孩子结点的上层结点叫该结点的双亲。
(9)兄弟(Sibling):同一双亲的孩子。
(10)树的度:一棵树中最大的结点度数。
(11)结点的层次(Level):从根结点开始定义根为第一层,它的孩子为第二层,依此类推。
(12)深度(Depth):树中结点最大层次的值。
(13)有序树:树中的各子树自左向右有序的称为有序树。
(14)无序树:树中的各子树自左向右无序的称为无序树。
(15)森林(Forest):是m(m≥0)棵互不相交的树的集合。
(16)祖先:是指从根结点到该结点之间所有的结点。
二叉树(Binary Tree)
概念:二叉树又叫二分树,它的特点是每个结点最多只有二棵子树,也就是二叉树中没有度大于2的结点。二叉树的子树有左右之分,严格区分左孩子、右孩子,其次序不能颠倒。
满二叉树
概念:一棵深度为k且有2k-1个结点的二叉树称为满二叉树。
完全二叉树
概念:如果有深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称为完全二叉树。
二叉树的遍历
(1)先序遍历(先根遍历)
1. 访问根结点
2. 先序遍历左子树
3. 先序遍历右子树
(2)中序遍历(中根遍历)
1. 中序遍历左子树
2. 访问根结点
3. 中序遍历右子树
(3)后序遍历(后根遍历)
1. 后序遍历左子树
2. 后序遍历右子树
3. 访问根结点
c++代码
BTree.h
#ifndef BTREE_H #define BTREE_H struct BTreeNode { int data; BTreeNode *lChild, *rChild; }; class BTree { public: void setRoot(BTreeNode* r) { root = r; } BTreeNode* getRoot() { return root; } BTreeNode* createBTree(); //中序遍历 void inOrder(BTreeNode*); //前序遍历 void preOrder(BTreeNode*); //后序遍历 void postOrder(BTreeNode*); //计算节点数 int BTreeSize(BTreeNode*); //计算子叶数 int BTreeLeaves(BTreeNode*); //计算树高 int BTreeHeight(BTreeNode*); private: BTreeNode* root; }; #endif
BTree.cpp
// BTree.cpp : 定义控制台应用程序的入口点。 // #include <iostream> #include <stack> #include <queue> #include "BTree.h" #include "stdafx.h" using namespace std; BTreeNode* BTree::createBTree() { BTreeNode* current = 0; int val = 0; cin >> val; if (val == -1) return NULL; else { current = new BTreeNode; current->data = val; current->lChild = createBTree(); current->rChild = createBTree(); return current; } } //中序遍历 void BTree::inOrder(BTreeNode* r) { if (r != 0) { inOrder(r->lChild); cout << r->data << " "; inOrder(r->rChild); } } //前序遍历 void BTree::preOrder(BTreeNode* r) { if (r != 0) { cout << r->data << " "; preOrder(r->lChild); preOrder(r->rChild); } } //后序遍历 void BTree::postOrder(BTreeNode* r){ if (r != 0) { postOrder(r->lChild); postOrder(r->rChild); cout << r->data << " "; } } //计算节点数 int BTree::BTreeSize(BTreeNode* r) { if (r == 0) return 0; else return 1 + BTreeSize(r->lChild) + BTreeSize(r->rChild); } //计算子叶数 int BTree::BTreeLeaves(BTreeNode* r) { if (r == 0) return 0; else if (r->lChild == 0 && r->rChild == 0) return 1; else return BTreeLeaves(r->lChild) + BTreeLeaves(r->rChild); } //计算二叉树高度 int BTree::BTreeHeight(BTreeNode* r) { if (r == 0) return 0; else { int lHei = BTreeHeight(r->lChild); int rHei = BTreeHeight(r->rChild); return (lHei > rHei) ? lHei + 1 : rHei + 1; } }
标签:pre parent blog str 基本 程序 完全二叉树 size create
原文地址:http://www.cnblogs.com/yqy38/p/7647639.html