二叉树的相关面试题不外乎以下几个方面:
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);
}
}