在二叉樹的相關題目中,我們經常會碰到這樣的問題,給出一顆二叉樹的前序遍歷和中序遍歷,或者是給出它的後序遍歷和中序遍歷,讓我們畫出這個二叉樹或者是用**實現如何用上面兩種情況來建立這個二叉樹。
首先我們來看看給出先序遍歷序列和中序遍歷序列如何畫出這顆二叉樹:
首先,先序遍歷序列中的第乙個字母肯定是這顆二叉樹的根節點,然後在中序遍歷的序列中找到這個根節點,以這個根節點作為分割,在中序遍歷序列中找到二叉樹根節點的左右子樹。
如下圖所示:
接著我們將左子樹的先序遍歷序列和中序遍歷序列單獨拿出來研究,跟上一步一樣,線序遍歷序列中第乙個字母為左子樹的根節點,然後在中序遍歷序列中找到根節點並以它作為分割找到此時的根節點的左右子樹。如下圖所示;
同樣的再將b節點的右子樹單獨拿出來分析我們就可以很容易得到以b為根節點的二叉樹如下:
然後再分析a節點的右子樹,它的右子樹只有g和h兩個節點,根據先序遍歷和中序遍歷的規則可以容易推出g為根節點,h為g的右子樹,g的左子樹為空,所以得到最終的二叉樹:
上面是由先序遍歷序列和中序遍歷序列推出二叉樹的過程,由後序遍歷序列和中序遍歷序列同樣的過程也可以畫出一顆二叉樹,但我們需要知道的是,如果只給出了先序遍歷序列和後序遍歷序列,我們無法畫出一顆確定的二叉樹,因為先序遍歷和後序遍歷的根節點是在最前面和最後面,因此我們無法推斷出這個根節點的左右子樹到底有哪些。所以說如果沒有給出中序遍歷序列,我們將無法得到一顆二叉樹。
接下來我們用**實現用先序遍歷序列和後序遍歷序列建立一顆二叉樹。
//找到中序序列中的根節點
intfindis
(char
* is,
int n,
char val)
}return pos;
}btnode*
createpi
(char
* ps,
char
* is,
int n)
return s;
}btnode*
createtreepi
(char
* ps,
char
* is,
int n)
return s;
}
我們給出需要進行測試的主函式**如下:
int
main()
preorder
(root)
; cout << endl;
inorder
(root)
; cout << endl;
endorder
(root)
; cout << endl;
return0;
}
通過執行結果我們可以看到這顆二叉樹通過給出的先序序列和中序序列被建立出來了:
通過中序序列和後序序列來建立二叉樹:
//找到中序序列中的根節點
intfindis
(char
* is,
int n,
char val)
}return pos;
}btnode*
createil
(char
* ls,
char
* is,
int n)
return s;
}btnode*
createtreeie
(char
* ls,
char
* is,
int n)
return s;
}int
main()
endorder
(root)
; cout << endl;
inorder
(root)
; cout << endl;
return0;
}
根據先序序列和中序,後序和中序序列建立二叉樹
思考 如何才能確定一棵樹?結論 通過中序遍歷和先序遍歷可以確定乙個樹 通過中序遍歷和後續遍歷可以確定乙個樹 通過先序遍歷和後序遍歷確定不了乙個樹。演算法實現 一 先序和中序重建二叉樹,按層次遍歷輸出 include include include include include include in...
二叉樹 先序序列 中序序列 後序序列
已知二叉樹的先序遍歷序列和中序遍歷序列,求後序遍歷序列。先遞迴構造二叉樹,然後遞迴得到後序序列。思路 先序序列的第乙個結點為要構造二叉樹的根結點,在中序序列中查詢二叉樹的根結點,則中序列根結點左邊為根結點的左子樹的中序序列,右邊為根結點的右子樹的中序序列。而先序序列根結點後面分別為它的左子樹和右子樹...
先序建立二叉樹及先序 中序 後序遍歷
先序二叉樹 先序建立二叉樹 void createbitree bitree t t bitnode malloc sizeof bitnode t data cnt t lchild null t rchild null createbitree t lchild createbitree t r...