面試之常考二叉樹
二叉樹的相關面試題不外乎以下幾個方面:
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);
}
}