1.二叉树的三种遍历
(1)先序遍历(前序遍历)
优先遍历二叉树的根节点,然后遍历其左子树,最后右子树;依据二叉树递归定义,所以遍历左子树时,相当于继续遍历一棵二叉树,故继续优先遍历二叉树的根节点,然后遍历其左子树,最后右子树;对遍历右子树同理。
(2)中序遍历
优先遍历二叉树的左子树,然后遍历其根节点,最后右子树。具体表现为,指针在左子树上向左一路只下,直到最左的叶节点才回头。
(3)后序遍历(前序遍历)
优先遍历二叉树的左子树,然后遍历右子树,最后遍历其根节点。
恢复二叉树
已知两种遍历顺序,可以恢复出一棵二叉树。
【天坑来了】注意上面这些遍历顺序结果是不知道终端节点的位置的!
先序遍历:abcdegf
中序遍历:cbegdfa
后序遍历:cgefdba
2.已知先序遍历的递归构建二叉树
所以为毛已知一个“先序遍历”可以恢复二叉树?纳尼!
所以菜鸡博主在做华为笔试的时候首先就是,“纳尼?什么鬼!”的神反映。
【注意!注意!】人家给的这先序遍历是加强版!
先序遍历加强版:abc##de#g##f###
其中,#表示终端节点的子节点为空的情况!所有,加强版先序遍历除了告诉我们二叉树先序遍历顺序,还告诉了我们那些节点是终端节点,因此,递归的时候就知道啥时候哪个节点该出栈了!是不是很神奇!博主真的是跟农民进城一样第一次发现了新大陆!非科班小白欣喜若狂,如获至宝!鄙视自己一下!
换句话说,“遍历顺序一般没有这个#符号(就是你亲爱的“null”),因此存在二义性,不能判断是没有子节点,还是下一个是同级的节点or下级节点。”
3.Java奇葩的Scanner
注意!注意!Java这Scanner没有读char的方法!
你可以nextXX()以及nextLine(),亦或是next()。但是你没法得到char!
你可能突发奇想,像楼主一样觉得char和int可以转换,读int转char,但是不幸的是,由于编码的原因,你在不了解当前编译器的编码的情况下,转过来maybe是乱码!
怎么办?保险起见,如下方法,亲试有效
// 读一个char进来
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
char c = scanner.next().charAt(0);
4.最终递归建树大概就是酱紫
public TreeNode createBinaryTree(){
char c = scanner.next().charAt(0);
TreeNode node;
if(c=='#'){
node=null;
}else{
node=new TreeNode(c);
node.left=createBinaryTree();
node.right=createBinaryTree();
}
return node;
}