1.已知一棵二叉樹的中序序列和后序序列分別是BDCEAFHG和DECBHGFA,請畫出這個棵二叉樹。
\(\color{red}{中序序列}\):BDCE A FHG (左根右)
\(\color{red}{后序序列}\):DECB HGF A (左右根)
解答思路:由后序序列可知 二叉樹的根節點是A,再由中序序列可知BDCE是二叉樹的左子樹 FHG是二叉樹的右子樹
同理,在后序序列BDCE中B是根結點A的左孩子,HGF中F是根結點A的右孩子。 由中序序列BDCE可知DCE是B根結點的右子樹,HGF可知HG是其右子樹。
同理,后序序列DEC中C是根結點B的的右孩子,由中序序列DCE知道D和E分別是C的左右孩子,由后序序列HG知道G是根結點,中序序列HG知道H是G的左孩子。

(2)把這棵二叉樹變成樹根據之前的口訣:二叉樹轉化為樹:(左孩右右連雙親,去掉原來右孩線)



解答的思路:關於初態不用提將權值的結點依次寫入數組1~8中,終態吶 從i=9開始(依照哈夫曼樹的構造方法 選用二小造新樹加個根 結點,則i=9存儲兩個權值最小結點構成的新二叉樹的根結點權值8,則可知其左右孩子即是兩個權值小的3和5即對應結點i=7和i=1,則其左右孩子的父節點parent就是權值8對應的結點i=9; 同理i=10,11,,,,依次選取兩個權值較小的構成新二叉樹生成新的根結點。
(4)一個具有 1025 個結點的二叉樹的高 h 為( )。
A.11 B.10 C.11 至 1025 之間 D.10至 1024 之間
答案:C
解釋:若每層僅有一個結點,則樹高 h 為 1025;且其最小樹高
為 \(log2^{1025}\)取底整數+ 1=11,即 h 在 11 至 1025 之間
(3)一棵完全二叉樹上有 1001 個結點,其中葉子結點的個數是( )。
A.250 B. 500 C.254 D.501
答案:D
解釋:設度為 0 結點(葉子結點)個數為 A,度為 1 的結點個數為 B,
度為 2 的結點個數為 C,有 A=C+1,A+B+C=1001,可得 2C+B=1000,
由完全二叉樹的性質可得 B=0 或 1,又因為 C 為整數,所以 B=0,
C=500,A=501,即有 501 個葉子結點。
2.在一棵度為4的樹T中,若有20個度為4的節點,10個度為3的節點,1個度為2的節點,10個度為1的節點,則樹T的葉節點個數 答案:82

3.以二叉鏈表為二叉樹的的存儲結構,統計二叉樹的葉子結點個數。
`Int LeafNodeCount(BiTree T)
{ if(T==null)
return 0; //如果是空樹,則葉子結點個數為0;
else if(T->lchild==null&&T->rchild==null)
return 1; //判斷結點是否是葉子結點(左右孩子都為空)若是返回1
else
return
LeafNodeCount(T-lchild)+ LeafNodeCount(T-rchild);}`
4.以二叉鏈表為二叉樹的的存儲結構,判斷兩棵樹是否相等。
` Int compareTree(TreeNode *tree1,TreeNode *tree2) //采用分冶的方法,比較當前根 然后比較左子樹和右子樹
{ bool tree1IsNull=(tree1==null);
bool tree2IsNull=(tree2==null);
if(tree1IsNull!=tree2IsNull)
{ return 1;
}
if(tree1IsNull&&tree2IsNull)//如果兩個都是Null 則相等
{
return 0;
} //如果根節點不相等 直接返回不相等 否則看它們孩子相等不想等
if(tree1->C!=tree2->C)
{
return 1;
}
return (compareTree(tree1->left,tree2->left)&&compareTree(tree1->right,tree2->right))
return (compareTree(tree1->left,tree2->right)&&compareTree(tree1->right,tree2->left))
}`
4.以二叉鏈表為二叉樹的的存儲結構,交換二叉樹每個結點的左右孩子。
`////如果結點左右子樹為空,否則交換該結點左右孩子然后遞歸交換左右子樹
void changeLR(BiTree &T)
{
BiTree temp;
if(T->lchild==null&&T->rchild==null)
return;
else
{ temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
} //交換左右孩子
changeLR(T->lchild); //遞歸交換左子樹
changeLR(T->rchild); //遞歸交換右子樹
} `
5.以二叉鏈表為二叉樹的的存儲結構,輸出二叉樹中從每個葉子結點到根結點的路徑。
`void AllPath(BTNode *b,ElemType path[],int pathlen)
{ int i;
if(b!=null)
{ if(b->lchild==null && b->rchild==null) //*b為葉子結點
{count<<" "<<b->data<<"到根節點的路徑:"<<b->data;
for(i=Pathlen-1;i>=0;i--)
count<<endl;
}
else
{ path[pathlen]=b->data; //當前結點放入路徑中
pathlen++; //路徑長度增1;
AllPath(b->lchild,path,pathlen); //遞歸掃描左子樹
AllPath(b->rchild,path,pathlen); //遞歸掃描右子樹
pathlen--; //恢復環境
}
}
}`
