以下是和树相关的笔试题
1.计算二叉树的深度
题目是 从根节点到叶节点的路径,所以就是求出二叉树的层数即可。
有以下几种解决办法:
方法一:采用递归的方式,分别计算左子树节点的深度和右子树深度,最终深度为左子树深度和右子树深度最大值添加1;
方法二:采用队列的方式,一层一层的遍历,没遍历一层将下一层的数据添加到队列中,同时深度加一;当队列为空时,即可获得最终的深度;
2.按之字形顺序打印二叉树
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
有以下几种解决办法:
方法一:采用队列的方式,分奇数和偶数,针对奇数和偶数采用不同的处理方式;
3.二叉搜索树的第k个节点
给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。
1.返回第k小的节点值即可
2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1
3.保证n个节点的值不一样
有几下几种方法:
方法一:先对二叉搜索树进行中序遍历,将遍历的结果写入到数组当中,然后获取第k个数据;
方法二:采用递归的方法,返回第k个数据;
1 import java.util.*; 2 3 /* 4 * public class TreeNode { 5 * int val = 0; 6 * TreeNode left = null; 7 * TreeNode right = null; 8 * public TreeNode(int val) { 9 * this.val = val; 10 * } 11 * } 12 */ 13 14 public class Solution { 15 /** 16 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 17 * 18 * 19 * @param proot TreeNode类 20 * @param k int整型 21 * @return int整型 22 */ 23 int num = 0; 24 public int KthNode (TreeNode proot, int k) { 25 if(proot == null){ 26 return -1; 27 } 28 int leftValue = KthNode(proot.left, k); 29 if(leftValue != -1){ 30 return leftValue; 31 } 32 num += 1; 33 if(num == k){ 34 return proot.val; 35 } 36 int rightValue = KthNode(proot.right, k); 37 return rightValue; 38 } 39 }
4.重建二叉树
给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
解题方法如下:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
if(pre.length == 0){
return null;
}
int val = pre[0];
TreeNode node = new TreeNode(val);
int i = 0;
for(; i < vin.length; i++){
if(vin[i] == val){
break;
}
}
int[] pre1 = copyArr(pre, 1, i);
int[] pre2 = copyArr(pre, i + 1, pre.length - 1);
int[] vin1 = copyArr(vin, 0, i - 1);
int[] vin2 = copyArr(vin, i + 1, vin.length - 1);
node.left = reConstructBinaryTree(pre1, vin1);
node.right = reConstructBinaryTree(pre2, vin2);
return node;
}
public int[] copyArr(int[] arr, int i, int j){
int[] result = new int[j - i + 1];
for(int k = 0; k < j - i + 1; k++){
result[k] = arr[i + k];
}
return result;
}
}
注:二叉树的遍历方式分为先序遍历,中序遍历和后续遍历;
可以通过先序遍历+中序遍历和后续遍历+中序遍历的方式重建二叉树;