先序遍历和递归建树的爱恨情仇

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值