數據結構學習總結--樹和二叉樹算法設計題


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--; //恢復環境
             }

          }
        }`


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM