小灰的算法之旅---createBinaryTree 的一点点疑问

前言

深知自己算法薄弱,所以最近在补充自己算法方面的知识,《小灰的算法之旅》这本书作为入门书籍不错,当时在看到《树-深度优先遍历》的代码时,我碰到了一点疑问,经过我多次代码验证,确实是代码不太严谨。

问题描述

在用java代码来示例深度优先遍历时,先要构造一个二叉树,书上的构造示例代码如下:

节点代码

构造函数
节点没啥问题,节点本身数据、左孩子、右孩子。但是这个createBinaryTree就有点问题了。是用递归没错,递归的结束条件:inputList这个集合被掏空,但是每次进入递归做的事情:设置左节点,然后进入递归,如此下去,最终会一直往左节点设置,14行的右节点设置本身没用。

口头描述可能有点干瘪,详细描述一下:
输入inputList = {1,2,3,4},调用createBinaryTree方法,运行时,栈空间的大概流程如下:
运行栈空间

圆圈中的序号即代表运行顺序
从主方法调用createBinaryTree方法开始(这步不重要没画),
1:进栈,创建了一个栈帧,inputList为{1,2,3,4},从inputList中拿出1,node1的data(变量为node,为了区分故意加的下标,实际上没有)为1
2:为node1设置左节点,
3:调用方法进栈,
4:进栈,创建了一个栈帧,inputList为{2,3,4},从inputList中拿出2,node2的data为2
5:为node2设置左节点
6:调用方法进栈,
7:进栈,创建了一个栈帧,inputList为{3,4},从inputList中拿出3,node3的data为3
8:为node3设置左节点
9:调用方法进栈,
10:进栈,创建了一个栈帧,inputList为{4},从inputList中拿出4,node4的data为4
11:为node4设置左节点
12:调用方法进栈,
13:进栈,创建了一个栈帧,inputList为{},
14:inputList为空集合触碰到递归的返回条件,返回null
15:方法出栈,retuen null,node4的左节点为null
16:为node4设置右节点,此时inputList已经为空了,所以node4右节点为null。省略图
17:方法正常结束出栈,return node4,node3的左节点为node4
18:为node3设置右节点,此时inputList已经为空了,所以node3右节点为null。
19、20:方法正常结束出栈,return node3,node2的左节点为node3
21:为node2设置右节点,此时inputList已经为空了,所以node2右节点为null。
22、23:方法正常结束出栈,return node2,node1的左节点为node2
24:为node1设置右节点,此时inputList已经为空了,所以node1右节点为null。
25:方法正常结束出栈,return node1。整个递归调用结束,返回头结点node1,

最终的结果:

最终的结果

所以我觉得这个createBinaryTree方法有点不妥。不能说有错,确实是生成了二叉树,而且是生成一种特殊的二叉树:所有结点都只有左节点。表达出了二叉树的多样性。但是,代码不严谨,因为设置右节点的代码是没用的,本身默认值就是null,在这个方法里面,所有设置的右节点也都是null。如果是想生成《所有结点都只有左节点》的二叉树,那何不将设置右节点的代码删除,减少方法调用进栈的次数呢?

改进

经过我改进后的createBinaryTree方法如下:

    /**
     * 生成满二叉树
     * @param height 二叉树的高度
     * @return 二叉树的头结点
     */
    TreeNode<Integer> createBinaryTree(int height){
        TreeNode<Integer> treeNode = new TreeNode<>(new Random().nextInt());
        for (int i = 0; i < height; i++) {
            treeNode.setRightChild(createBinaryTree(i-1));
            treeNode.setLeftChild(createBinaryTree(i-1));
        }
        return treeNode;
    }

当然,这是生成的满二叉树

---------------------------------------------补充------------------------------
书的后面部分有说明,作者是这么用这个递归的:

在这里插入图片描述

这样用的话,确实没问题,还可以按照自己想法构建树,比满二叉树要灵活

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值