树
数据结构中的树有且仅有一个树根,树上的元素都是从树根衍生出来的。
- 每颗非空树有且仅有一个根结点;
- 在树上,从一个结点出发可以访问到其余结点,并且一个结点到另一个结点的路径有且仅有一条;
- 父亲结点可以有多个孩子结点,除根结点外,其余的结点有且仅有一个父亲节点;
- 根结点没有父亲结点,叶子结点没有孩子结点。
二叉树:每个结点最多只有两个孩子结点
性质:
- 二叉树的第 i 层最多有 个结点;
- 深度为 k 的二叉树最多有 个结点;
- 任意一颗二叉树上,叶子结点个数比度为2的结点数多1;
满二叉树:一棵树深度为 k 且有 个结点;
完全二叉树:一棵树深度为 k ,从第一层到第k-1层该树是满二叉树,第k层的节点都集中在左边;
二叉树的广义表达形式:
形式为 a(b, c) ,表示根节点 a,a 的左孩子节点为b,右孩子节点为 c,中间用一个逗号隔开。如果左右孩子节点不为空,则用以上形式来替换;如果节点为空,则不填任何字符。

二叉树的创建和先序、中序、后续遍历:
1 #include<iostream> 2 using std::cout; 3 using std::endl; 4 class Node { 5 public: 6 int data; 7 Node * lchild, * rchild; 8 Node(int _data) { 9 data = _data; 10 lchild = NULL; 11 rchild = NULL; 12 } 13 ~Node() { 14 if (lchild != NULL) { 15 delete lchild; 16 } 17 if (rchild != NULL) { 18 delete rchild; 19 } 20 } 21 void preorder() { 22 cout << data << " "; 23 if (lchild != NULL) { 24 lchild -> preorder(); 25 } 26 if (rchild != NULL) { 27 rchild -> preorder(); 28 } 29 } 30 void inorder() { 31 if (lchild != NULL) { 32 lchild -> inorder(); 33 } 34 cout << data << " "; 35 if (rchild != NULL) { 36 rchild -> inorder(); 37 } 38 } 39 void postorder() { 40 if (lchild != NULL) { 41 lchild -> postorder(); 42 } 43 if (rchild != NULL) { 44 rchild -> postorder(); 45 } 46 cout << data << " "; 47 } 48 }; 49 class BinaryTree { 50 private: 51 Node * root; 52 public: 53 BinaryTree() { 54 root = NULL; 55 } 56 ~BinaryTree() { 57 delete root; 58 } 59 void build_demo() { 60 root = new Node(4); 61 root -> lchild = new Node(2); 62 root -> lchild -> lchild = new Node(1); 63 root -> lchild -> rchild = new Node(3); 64 root -> rchild = new Node(6); 65 root -> rchild -> lchild = new Node(5); 66 root -> rchild -> rchild = new Node(7); 67 } 68 void preorder() { 69 root -> preorder(); 70 } 71 void inorder() { 72 root -> inorder(); 73 } 74 void postorder() { 75 root -> postorder(); 76 } 77 }; 78 int main() { 79 BinaryTree binarytree; 80 binarytree.build_demo(); 81 binarytree.preorder(); 82 cout << endl; 83 binarytree.inorder(); 84 cout << endl; 85 binarytree.postorder(); 86 return 0; 87 }
广义表创建二叉树:
设置一个标记变量 k,初始为 -1;
设置一个标记节点 p;
循环遍历存储广义表的字符串 str:
如果 str[i] 是左括号:
则设置 k 为 0;
把 p 压入栈中。
否则如果 str[i] 是逗号:
则设置 k 为 1。
否则如果 str[i] 是右括号:
则栈顶元素出栈。
否则如果 str[i] 是一个字母,用节点 temp 来存储:
如果 k 为 -1:
则把 temp 作为根节点并压入栈中。
如果 k 为 0:
如果此时栈顶节点是 p,则先出栈;
然后将 temp 作为栈顶节点的左孩子;
再把 temp 压入栈中。
如果 k 为 1:
栈顶元素出栈;
将 temp 作为栈顶节点的右孩子;
再把 temp 压入栈中。
输出二叉树的广义表形式:
输出节点存储的值;
如果左孩子不为空:
输出 "(";
递归输出左子树;
如果右孩子为空:
输出 ")"。
如果右孩子不为空:
如果左孩子为空:
输出 "("。
输出 “,”;
递归输出右子树;
输出 ")"。

浙公网安备 33010602011771号