树的相关知识
树是由节点构成,
也可以是没有节点,空树。
最底端有一个根节点,根节点是特殊的节点,一棵树,只有一个。
从根节点触发,每个节点都可以有多个子节点。
当一个节点没有子节点的情况下,我们称它为 叶子节点。
树的深度:树有多少层
二叉树
每个节点至多有两个子节点的树。
二叉搜索树
每一个节点而言,左边的永远比父节点小,右边的永远比父节点大
这样的树我们称之为:
二叉查找树 or 二叉搜索树 or 二叉排序树
二叉树的遍历
先序遍历(先根遍历):根、左、右
中序遍历(中根遍历):左、根、右
后序遍历(后根遍历):右、根、左
根 左孩子 根 右孩子 根
Java代码的实现
public class Test04 {
public static void main(String[] args) {
// Node tree=new Node();
// tree.value=5;
// tree.left=new Node();
// tree.left.value=4;
// tree.right=new Node();
// tree.right.value=6;
int [] a={5,6,8,7,2,9,1,3,4};
Node tree=new Node();
tree.value=a[0];
for (int i = 1; i < a.length; i++) {
insertToTree(tree,a[i]);
}
System.out.println(tree.right.right.left.value);
System.out.println(tree.left.right.right.value);
System.out.println("-------------------------");
printTree(tree);
}
private static void printTree(Node tree){
//遍历根节点
System.out.print(tree.value+" ");
//遍历左子树
if(tree.left!=null){
printTree(tree.left);
}
//遍历右子树
if(tree.right!=null) {
printTree(tree.right);
}
}
private static void insertToTree(Node tree,int value){
if(tree.value>value){
//放左边
if(tree.left==null){
tree.left=new Node();
tree.left.value=value;
}else{
//就把value放入左子树中
insertToTree(tree.left,value);
}
}else{
//放右边
if(tree.right==null){
tree.right=new Node();
tree.right.value=value;
}else{
//就把value放入右子树中
insertToTree(tree.right,value);
}
}
}
static class Node{
int value;
Node left;
Node right;
}
}
面试题测试
面试题:
已知二叉树的
先序遍历结果为:1 2 4 6 3 5 7 8
中序遍历结果为:2 6 4 1 7 5 8 3
求后序遍历结果。
后序遍历:6 4 2 7 8 5 3 1
满二叉树
满二叉树:深度为k且节点个数为2^k-1。
一颗满二叉树,节点数为n,深度为多少?
2^k-1=n
2^k=n+1
K=log(n+1)
完全二叉树
给一颗满二叉树,由根开始逐层从左至右标号,在满二叉树的基础上,删去编号最高的节点,就得到一颗完全二叉树;在完全二叉树的基础上,删去编号最高的节点,也可得到一颗完全二叉树
面试题测试
一颗完全二叉树,深度为k,它至少有多少个叶子节点?
K-1的满二叉树
2^(k-2)