树的建立 和 后序遍历

通过递归方式建立一棵树,之后分别给出树后序遍历的递归非递归方式

这是一棵树

终端输入:
A
B 
#
C
D
#
# 
E 
#
#
F
# 
G 
H 
# 
# 
#
//code
public class CreateTree {
    public static void main(String[] args) {
        TreeNode t = null;
        TreeNode input = input(t);
        beforeTraversal(input);
        System.out.println();
        beforeTraversal1(input);
        //System.out.println(input);
    }

    //递归方式建树
    public static TreeNode input(TreeNode T){
        Scanner scanner = new Scanner(System.in);
        String in = scanner.next();

        if("#".equals(in)){
            T = null;
        }else{
            T = new TreeNode();
            T.data = in;
            T.left = input(T.left);
            T.right = input(T.right);
        }
        return T;
    }


    //后续遍历 递归方法
    public static void beforeTraversal(TreeNode node){
        if(node!=null){
            beforeTraversal(node.left);
            beforeTraversal(node.right);
            System.out.print(node.data);
            System.out.print(" ");
        }
    }

    //后序遍历 非递归方法
    public static void beforeTraversal1(TreeNode node){
        //定义栈用于存放节点
        Stack<TreeNode> stack = new Stack<>();
        if(node!=null){
            TreeNode node1 = node;
            TreeNode cur = null;  //栈顶元素
            TreeNode h = node;    //记录最近弹出的节点
            while (true) {
                //压入树节点,直至左节点为空
                while (node1 != null) {
                    stack.push(node1);
                    node1 = node1.left;
                }

                if (!stack.isEmpty()) {
                    //节点一旦弹出就找不到了,因此在这不弹出,先进行判断
                    cur = stack.peek();
                    //当该节的右子节点为null 或者 该节点的右子节点已经打印过了
                    //根据后续排序:左 右 中,因此就应当弹出该节点
                    if (cur.right == null || cur.right == h) {
                        System.out.print(stack.pop().data);
                        System.out.print(" ");
                        //记得保留刚刚弹出的节点
                        h = cur;
                    } else {
                        //如果节点不满足上述条件,这说明还需继续压入
                        node1 = cur.right;
                    }

                }else {
                    return;
                }
            }
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值