二叉树的遍历(递归和非递归)
二叉树的遍历一向是数据结构的一个重要的知识点,而且在面试中往往会考到,有必要注意一下,掌握它的思想,就很容易了。
1.先序遍历(“根结点-左孩子-右孩子”)
1 void preOrder1(BinTree *root) //递归前序遍历 2 { 3 if(root!=NULL) 4 { 5 cout<<root->data<<" "; 6 preOrder1(root->lchild); 7 preOrder1(root->rchild); 8 } 9 }
1 void preOrder2(BinTree *root) //非递归前序遍历 2 { 3 stack<BinTree*> s; 4 BinTree *p=root; 5 while(p!=NULL||!s.empty()) 6 { 7 while(p!=NULL) 8 { 9 cout<<p->data<<" "; 10 s.push(p); 11 p=p->lchild; 12 } 13 if(!s.empty()) 14 { 15 p=s.top(); 16 s.pop(); 17 p=p->rchild; 18 } 19 } 20 }
2.中序遍历(“左孩子-根节点-右孩子”)
1 void inOrder1(BinTree *root) //递归中序遍历 2 { 3 if(root!=NULL) 4 { 5 inOrder1(root->lchild); 6 cout<<root->data<<" "; 7 inOrder1(root->rchild); 8 } 9 }
1 void inOrder2(BinTree *root) //非递归中序遍历 2 { 3 stack<BinTree*> s; 4 BinTree *p=root; 5 while(p!=NULL||!s.empty()) 6 { 7 while(p!=NULL) 8 { 9 s.push(p); 10 p=p->lchild; 11 } 12 if(!s.empty()) 13 { 14 p=s.top(); 15 cout<<p->data<<" "; 16 s.pop(); 17 p=p->rchild; 18 } 19 } 20 }
3.后序遍历(左孩子-右孩子-根节点)
void postOrder1(BinTree *root) //递归后序遍历 { if(root!=NULL) { postOrder1(root->lchild); postOrder1(root->rchild); cout<<root->data<<" "; } }
1 void postOrder2(BinTree *root) //非递归后序遍历 2 { 3 stack<BTNode*> s; 4 BinTree *p=root; 5 BTNode *temp; 6 while(p!=NULL||!s.empty()) 7 { 8 while(p!=NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点 9 { 10 BTNode *btn=(BTNode *)malloc(sizeof(BTNode)); 11 btn->btnode=p; 12 btn->isFirst=true; 13 s.push(btn); 14 p=p->lchild; 15 } 16 if(!s.empty()) 17 { 18 temp=s.top(); 19 s.pop(); 20 if(temp->isFirst==true) //表示是第一次出现在栈顶 21 { 22 temp->isFirst=false; 23 s.push(temp); 24 p=temp->btnode->rchild; 25 } 26 else //第二次出现在栈顶 27 { 28 cout<<temp->btnode->data<<" "; 29 p=NULL; 30 } 31 } 32 } 33 }
浙公网安备 33010602011771号