1. 程式人生 > >二叉樹的後序遍歷-遞迴和非遞迴演算法

二叉樹的後序遍歷-遞迴和非遞迴演算法

同樣的,建立的演算法在先序中有,略去。

  • 後序遞迴遍歷演算法
void PostOrder(BiTree bt){
	if(bt){
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
		cout<<bt->data<<" ";
	}
}
  • 後序非遞迴演算法

思想:

 

  先序序列: 1 、2 、3 、5 、4

  後序序列: 3 、5、2 、4 、1

  把後續序列逆序得:

  逆序後的後序序列:1 、4 、2 、5 、3

  觀察,逆序後序列和先序序列有一定聯絡,逆序後的序列可以看做:是先序序列中對其左右子樹遍歷順序交換得到的結果。

  • 根據根劃分出左右的子樹(先序序列)  

1 、 [2 、3 、5] 、 [4]

  • 交換根的左右子樹遍歷序列

1 、 [4]  、 [2 、 3  、 5]

  • 交換以2為根的左右子樹遍歷序列

1 、 [4]  、 [2 、 5  、 3]

  • 整體逆序得到後序序列:

3 、 5 、 2 、 4 、 1

程式碼:

void PostOrder(BiTree bt){
	BiTree stack[20];
	BiTree result[20];
	int top1 = -1, top2=-1;
	stack[++top1] = bt;
	while(top1!=-1){
		bt = stack[top1--];
		result[++top2] = bt;  //只用來反向最後的一趟的結果
		/*
		由於棧的特點就是後進先出,所以左子樹先入棧,然後出去的時候
		是右子樹先出棧,故而這裡就完成了第一次的左右子樹的交換		
		*/ 
		if(bt->lchild!=NULL){
			stack[++top1] = bt->lchild;
		}
		if(bt->rchild!=NULL){
			stack[++top1] = bt->rchild;
		}
	}
	while(top2!=-1){
		bt = result[top2--];
		cout<<bt->data<<" ";
	}
}

 

 

作者:無涯明月

發文時間:2018-11-16