二叉树的先、中、后、层序遍历 (非递归)
二叉树的遍历,求高度、叶子、结点的非递归形式,可以在某一个遍历中增加一项用于统计的次数即可。
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 }