1. 程式人生 > >面試之常考二叉樹

面試之常考二叉樹

二叉樹的相關面試題不外乎以下幾個方面:

 1、二叉樹的基本性質;
 2、遞迴建立二叉樹;
 3、遞迴遍歷二叉樹(先序、中序、後序);
 4、非遞迴遍歷二叉樹(先序、中序、後序);
 5、求二叉樹的節點個數;
 6、求二叉樹的深度;
 7、分層遍歷二叉樹;
 8、求二叉樹第k層的節點個數;
 9、求二叉樹的映象;

就這麼多吧,下面一一說明(附加原始碼):

一、 二叉樹的基本性質
1)二叉樹第 i 層上最多有這裡寫圖片描述個節點

這裡寫圖片描述
2)深度為 k 的二叉樹,最多有這裡寫圖片描述個節點
這裡寫圖片描述
3)對於任意一顆二叉樹T,如果其終端節點數為n1,度數為2的節點數為n2, 則 n1 = n2 + 1;
這裡寫圖片描述

4)具有n個節點的完全二叉樹深度為[ log2n] + 1;
設二叉樹的深度為k,則有如下公式:
這裡寫圖片描述

由此公式得出k=[ log2n] + 1
二、遞迴建立二叉樹
 有點問題,稍後補上。
 先來個一般性的建立二叉樹的程式碼:
 首先定義結點類:左孩子、右孩子、值;

 /** 
     *  
     * 內部節點類 
     * @author
DL */
public class Node{ public Node left; public Node right; public int data; public Node(int data){ this.left = null; this.right = null; this.data = data; } }

非遞迴實現二叉樹的建立

  public static void main(String[] args) {  
        Node r1
= new Node(1); Node r2 = new Node(2); Node r3 = new Node(3); Node r4 = new Node(4); Node r5 = new Node(5); Node r6 = new Node(6); r1.left = r2; r1.right = r3; r2.left = r4; r2.right = r5; r3.right = r6; }

建立後的二叉樹如下所示:
這裡寫圖片描述
三、遞迴遍歷二叉樹(先序、中序、後序)
先序遍歷:
 三步走:

1)列印節點值
2)遞迴列印左節點值
3)遞迴列印右節點值

   /** 
     * 前序遍歷 
     * @param node 
     */  
    public static void preOrder(Node node){  
        if(node != null){  
            System.out.print(node.data+" ");  
            preOrder(node.left);  
            preOrder(node.right);  
        }  
    }  

隨後我進行測試:

 public static void preOrder(Node node){  
        if(node != null){  
            System.out.print(node.data+" ");  
            preOrder(node.left); 
            System.out.print(node.data+" ");
            preOrder(node.right);  
            System.out.print(node.data+"22"+" ");
        }  
    }  

列印結果如下:1 2 4 4 422 2 5 5 522 222 1 3 3 6 6 622 322 122
分析:按常理來說,應該列印
1 2 4 4(左) 422(右)
再回退到2,列印右孩子 5 5 522
右孩子列印完成後,再次回退到2 ,列印222
回退到1,列印右孩子3 3(左孩子) 6(3的右孩子) 6(左孩子) 622(右孩子)
回退到322,再回退到122
至此分析完畢。
中序遍歷:

 /** 
     * 中序遍歷 
     * @param node 
     */  
    public static void inOrder(Node node){  
        if(node != null){  
            inOrder(node.left);  
            System.out.println(node.data);  
            inOrder(node.right);  
        }  
    }  
    /** 
     * 後序遍歷 
     * @param node 
     */  
    public static void postOrder(Node node){  
        if(node != null){  
            postOrder(node.left);  
            postOrder(node.right);  
            System.out.println(node.data);  
        }  
    }