前記:這一章課件裡主要講了樹和二叉樹的屬性和一些常用的操作。下面針對二叉樹的遍歷舉乙個具體的例子,這個題目在等級考試或者面試中都經常出現,大家多思考一下。
一
題目描述:
已知二叉樹前序遍歷和中序遍歷分別為:abdegcfh和dbgeachf,則該二叉樹的後序遍歷為?
答案:
dgebhfca
解題思路:
先序遍歷的第乙個結點是根結點,所以a是根;
然後在中序遍歷中找到a,(dbge)a(chf);
由中序遍歷的定義知(dbge)是左子樹的中序遍歷,(chf)是右子樹的中序遍歷。
然後在先序遍歷中把左子樹和右子樹劃開,a(bdeg)(chf),所以b是左子樹根,c是右子樹根。
然後繼續在中序遍歷中找到b和c,((d)b(ge))a(c(hf))。
對於dbeg,b是根,d是左子樹,eg是右子樹的中序遍歷,對於chf,c是根,hf是右子樹的中序遍歷。因為仍然有沒劃分完的部分,所以繼續看先序。
對於bdeg,b是根已知,d是整個左子樹已知,所以eg是右子樹的先序遍歷,e是右根,再對照中序可知g是e的左子樹,chf同理。
所以樹的結構是a(b(d,e(g,)),c(,f(h,)))
把它畫成圖,後序遍歷就是dgebhfca
總之先序序列是用來確定根結點,中序序列是用來劃分出左右子樹。
二
題目:
建立一棵二叉樹,並對其進行遍歷(先序、中序、後序),列印輸出遍歷結果
[基本要求]
從鍵盤接受輸入(先序),以二叉鍊錶作為儲存結構,建立二叉樹(以先序來建立),並採用遞迴演算法對其進行遍歷(先序、中序、後序),將遍歷結果列印輸出。
[測試資料]
abc de g f (其中 表示空格字元)
則輸出結果為
先序:abcdegf
中序:cbegdfa
後序:cgbfdba
c語言描述的方法:
//示例的是先序遍歷,其它的可以在這個基礎上改。
#include#includetypedef struct tnode
tnode;
tnode *tree_creat(tnode *t)
return t;
}void preorder(tnode *t)
}void main()
'); (window.slotbydup = window.slotbydup || ).push(); })();
'); (window.slotbydup = window.slotbydup || ).push(); })();
二叉樹的相關題目
目錄 1 求二叉樹的遍歷順序為自下至上,自右至左的層序遍歷序列 2 判斷二叉樹是否為完全二叉樹 3 統計二叉樹中雙分支結點的個數 4 求先序遍歷序列中第k個結點的值 5 求二叉樹的高度 6 判斷二叉樹是否為二叉排序樹 7 求出二叉排序樹中結點所在的層數 演算法思想 使用層序遍歷。二叉樹正常的層序遍歷...
合併兩個二叉樹
給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。示例 1 輸入 tree 1 tree 2 1 2 3 2...
兩個二叉樹的問題
乙個以1為根的帶權二叉樹,每個點都有個權值 vi v i。求每乙個點的左右關聯點個數。倍增快速跳即可,如下 include using namespace std define r register define maxn 1000005 int n,v maxn lson maxn rson ma...