面试之常考二叉树

二叉树的相关面试题不外乎以下几个方面:

 1、二叉树的基本性质;
 2、递归建立二叉树;
 3、递归遍历二叉树(先序、中序、后序);
 4、非递归遍历二叉树(先序、中序、后序);
 5、求二叉树的节点个数;
 6、求二叉树的深度;
 7、分层遍历二叉树;
 8、求二叉树第k层的节点个数;
 9、求二叉树的镜像;

就这麽多吧,下面一一说明(附加源码):

一、 二叉树的基本性质
1)二叉树第 i 层上最多有这里写图片描述个节点

面试之常考二叉树_第1张图片
2)深度为 k 的二叉树,最多有这里写图片描述个节点
这里写图片描述
3)对于任意一颗二叉树T,如果其终端节点数为n1,度数为2的节点数为n2, 则 n1 = n2 + 1;
面试之常考二叉树_第2张图片

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; 
    }  

创建后的二叉树如下所示:
面试之常考二叉树_第3张图片
三、递归遍历二叉树(先序、中序、后序)
先序遍历:
 三步走:

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);  
        }  
    }

你可能感兴趣的:(2017面试笔试)