数据结构中的树有且仅有一个树根,树上的元素都是从树根衍生出来的。

  • 每颗非空树有且仅有一个根结点;
  • 在树上,从一个结点出发可以访问到其余结点,并且一个结点到另一个结点的路径有且仅有一条;
  • 父亲结点可以有多个孩子结点,除根结点外,其余的结点有且仅有一个父亲节点;
  • 根结点没有父亲结点,叶子结点没有孩子结点。

二叉树:每个结点最多只有两个孩子结点

性质:

  • 二叉树的第 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 压入栈中。

输出二叉树的广义表形式:

输出节点存储的值;

如果左孩子不为空:

    输出 "(";

    递归输出左子树;

    如果右孩子为空:

        输出 ")"。

如果右孩子不为空:

    如果左孩子为空:

        输出 "("。

    输出 “,”;

    递归输出右子树;

    输出 ")"。

posted @ 2017-09-18 16:32  Xehanort_Hajime  阅读(169)  评论(0)    收藏  举报