遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每乙個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為乙個線性序列來表示。
設l、d、r分別表示遍歷左子樹、訪問根結點和遍歷右子樹, 則對一棵二叉樹的遍歷有三種情況:dlr(稱為先根次序遍歷),ldr(稱為中根次序遍歷),lrd (稱為後根次序遍歷)。
首先訪問根,再先序遍歷左(右)子樹,最後先序遍歷右(左)子樹,c語言**如下:
void
xxbl(tree *root)
首先中序遍歷左(右)子樹,再訪問根,最後中序遍歷右(左)子樹,c語言**如下
void
zxbl(tree *root)
首先後序遍歷左(右)子樹,再後序遍歷右(左)子樹,最後訪問根,c語言**如下
void
hxbl(tree *root)
即按照層次訪問,通常用佇列來做。訪問根,訪問子女,再訪問子女的子女(越往後的層次越低)(兩個子女的級別相同)
我們首先找到根結點:一定是先序遍歷序列的第乙個元素:1
然後,在中序序列尋找根,把中序序列分為兩個序列左子樹4,7,2和右子樹5,3,8,6
把先序序列也分為兩個: 左子樹2,4,7和右子樹3,5,6,8
對左右重複同樣的過程:
先看左子樹:先序序列4,7,2,說明4一定是左子樹的根
把2,4,7分為2和7兩個序列,再重複過程,左邊確定完畢。
右子樹同樣:中序序列為5,3,8,6,先序序列為:3,5,6,8
取先序頭,3.一定是根
把中序序列分為 5和8,6兩個序列
對應的先序序列為 5和6,8兩個序列
然後確定了5是3的左孩子
對於先序序列6,8和中序序列8,6
還是先取先序的頭,6
現在只有8,中序序列8在左邊,是左孩子。
結束。我們總結一下這種方法的過程:
1、根據先序序列確定當前樹的根(第乙個元素)。
2、在中序序列中找到根,並以根為分界分為兩個序列。
3、這樣,確定了左子樹元素個數,把先序序列也分為兩個。
對左右子樹(對應的序列)重複相同的過程。
我們把思路用**實現:
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution:
# 返回構造的treenode根節點
def reconstructbinarytree(self, pre, tin):
# write code here/
#pre-先序陣列 tin->中序陣列
if len(pre) == 0:
return none
root = treenode(pre[0])//第乙個元素為根
pos = tin.index(pre[0])//劃分左右子樹
root.left = self.reconstructbinarytree( pre[1:1+pos], tin[:pos])
root.right = self.reconstructbinarytree( pre[pos+1:], tin[pos+1:])
return root
思路是類似的,只是我們確定根的時候,取後序序列的最後乙個元素即可。
我們直白的表述一下,前序是中左右,後序是左右中。
所以,我們憑先序和後序序列其實是無法判斷根的孩子到底是左孩子還是右孩子。
比如先序序列1,5,後序序列是5,1
我們只知道1是這棵樹的根,但是我們不知道5是1的左孩子還是右孩子。
我們的中序序列是左中右,才可以明確的劃分出左右子樹,而先序後序不可以。
綜上,只有,只含葉子結點或者同時有左右孩子的結點的樹,才可以被先序序列後序序列確定唯一一棵樹。
最後不斷劃分先序和後序序列完成重建。
先序 中序和後序陣列兩兩結合重構二叉樹
題目 已知一棵二叉樹的所有節點值都不同,給定這棵二叉樹正確的先序 中序和後序陣列。請分別用三個函式實現任意兩種陣列結合重構原來的二叉樹,並返回重構二叉樹的頭結點。public class preinposttobst public static node preintotree int pre,in...
二叉樹 先序 中序 後序
同學整理的,順便傳上分享下 一,已知先序和中序 求後序 1 include2 include3 include4 using namespace std 5char s1 10 s2 10 ans 10 6 int o 0 7 void tree int n char s1 char s2 char...
先序中序重建二叉樹
includeusing namespace std vectorpre,in int p typedef struct node vectorpost int rec int l,int r 通過前序和後序得到樹 int main for int i 0 i tem in.push back te...