二叉树的先、中、后、层序遍历 (非递归)

  二叉树的遍历,求高度、叶子、结点的非递归形式,可以在某一个遍历中增加一项用于统计的次数即可。

  

 1 //层序遍历:以rear走两步(即两个if()语句),front走一步的来遍历,结合队列画图可清晰了解遍历思想
 2 void Tree::leverTree(Node * root) {
 3     Node * p = NULL;
 4     Node * Queue[max];        // 层序遍历,用队列,先进先出
 5     int front = -1, rear = -1;
 6     if (root == NULL) {
 7         return;
 8     } else {
 9         Queue[++rear] = root; // 进队头
10         while (front != rear) {
11             p = Queue[++front];    // 出队,并输出
12             cout << p->data << " ";
13             if (p->lchild != NULL) {    // 队头有左孩子
14                 Queue[++rear] = p->lchild;
15             }
16             if (p->rchild != NULL) {    // 队头有右孩子
17                 Queue[++rear] = p->rchild;
18             }
19         }
20     }    
21     cout << endl;
22 }
23 //后序遍历:
24 void Tree::postTree(Node * root) {    
25     Node * p = NULL;
26     Node * Stack[max];
27     int top = -1;
28     bool flag = false;
29     if (root != NULL) {
30         do {
31             while (root != NULL) {    // 将左孩子入栈
32                 Stack[++top] = root;
33                 root = root->lchild;
34             }
35             p = NULL;    //初始化为空,来判断当前的栈顶有无右孩子,无则该右孩子就是空NULL
36             flag = false;    // false表示不含右孩子
37             while (top != -1 && flag == false) {
38                 root = Stack[top];    // 取栈顶元素
39                 if (root->rchild == p) {    //第一次执行该语句时 p为空,非第一次 p 指向的是上一个访问的结点
40                     cout << root->data << " ";
41                     top--;        // 此时出栈
42                     p = root;    // 指向访问的结点,即出栈的元素地址
43                 }
44                 else {    // 指向该语句,只表示当前结点含有右孩子,需要入栈,后再去访问它的左子树
45                     root = root->rchild;
46                     flag = true;
47                 }
48             }
49         } while (top != -1);
50         cout << endl;
51     }
52 }
53 //中序遍历:
54 void Tree::inTree(Node * root) {    
55     Node * p = NULL;
56     Node * Stack[max];
57     int top = -1;
58     if (root != NULL) {
59         p = root;
60         while ( p != NULL|| top > -1) {    
61             while (p != NULL) {        // 将左子树的所有左孩子入栈
62                     Stack[++top] = p;
63                     p = p->lchild;
64                 }    // 左子树的左孩子全部入栈完毕
65             if (top > -1){        // 中序遍历,左孩子为空,就输出当前结点,并操作该结点的右子树
66                 p = Stack[top--];
67                 cout << p->data << " ";
68                 p = p->rchild;    // 操作右子树
69             }
70         }
71         cout << endl;
72     }
73 }
74 //先序遍历:
75 void Tree::preTree(Node * root) {
76     Node * p = NULL;
77     Node * Stack[max];
78     int top = -1;
79     if (root != NULL) {
80         Stack[++top] = root;    // 如果 当前结点不空,就将其入栈
81         while (top > -1) {        // 栈不空,含有元素,继续循环
82             p = Stack[top--];    // 将栈顶元素出栈,由于还需要访问左右孩子, 故保存栈顶地址 给 P, 然后输出栈顶元素
83             cout << p->data << " ";    // 注意下面的代码,由于要先访问左孩子,根据栈的特点,必须让右孩子先入栈,才能达到 左孩子后进先出先访问
84             if (p->rchild != NULL) {    // 出栈的栈顶元素 p 有右孩子,就入栈
85                 Stack[++top] = p->rchild;
86             }
87             if (p->lchild != NULL) {    // 出栈的栈顶元素 p 有左孩子,就入栈
88                 Stack[++top] = p->lchild;
89             }
90         }
91         cout << endl;
92     }
93 }

 

posted @ 2016-11-10 14:41  enjoy_Lify  阅读(277)  评论(0编辑  收藏  举报