二叉树非递归遍历实现-java版本

最近看了一下二叉树非递归遍历的实现,现在将思路写出来,若有不对,希望大家能够指出

 //二叉树非递归先序遍历
    private void preOrderBSTByUnRecur(Node head){
        //先判断头节点是否为空
        if(head != null){
            Stack<Node> stack = new Stack<Node>();
            //先顺遍历是先父节点,然后父节点的左儿子,父节点的右儿子,
            //所以先要将父节点压入栈
            stack.add(head);
            //只要栈不为空则表示二叉树没有遍历完成
            while(!stack.isEmpty()){
                //先序遍历比较简单,访问父节点弹出后立即打印
                //并判断是否右结点,有则入栈,然后判断是否有
                //左结点,有则入栈
                head = stack.pop();
                System.out.println(head.data);
                //会有人问为什么先右后左,因为父结点读取值
                //后不保存状态,所以先将右儿子压入栈,然后
                //再判断是否有左儿子,有的话下一次操作则先
                //对左儿子进行操作,符合先序遍历的逻辑
                if(null != head.rightChild)
                    stack.add(head.rightChild);
                if(null != head.leftChild)
                    stack.add(head.leftChild);
            }
        }
    }

    //二叉树非递归中序遍历
    private void inOrderBSTByUnRecur(Node head){
        if(head != null){
            Stack<Node> stack = new Stack<Node>();
            //中序遍历是先左儿子,父结点,右儿子,所以循环条件
            //是栈不为空且当前结点不为空
            while(!stack.isEmpty() || head != null){
                //只要父结点的左儿子不为空,则进行进栈操作
                if(head != null){
                    stack.push(head);
                    head = head.leftChild;
                }else{
                    //此时已经将整颗二叉树的最左端的
                    //左儿子压入栈,然后弹出并读值,取其右节点,
                    //这时候有两种情况:1.右结点存在,则进入上一个判断
                    //取他的左儿子2.若右结点不存在,那么继续弹出并读值
                    head = stack.pop();
                    System.out.println(head.data);
                    head = head.rightChild;
                }

            }
        }
    }

    //非递归后续遍历
    private void postOrderBSTByUnRecur(Node head){
        if(null != head){
            Stack<Node> stack = new Stack<>();
            //cur为stack的栈顶元素,pre为最后一个被打印的元素(初始值为根节点)
            Node cur = null,pre = head;
            //先将根节点押入
            stack.push(pre);
            //stack为空则表示整个二叉树已遍历完
            while(!stack.isEmpty()){
                //cur为stack中的栈顶元素
                cur = stack.peek();
                //有三种情况,1.栈顶元素的左节点不为空,而最后打印元素不等于栈顶元素的左节点与右节点,
                //表示栈顶元素的左节点还未遍历,则入栈
                if(cur.leftChild != null && pre != cur.leftChild && pre != cur.rightChild){
                    stack.push(cur.leftChild);
                //2.栈顶元素的右节点不为空,而最后打印元素不等于栈顶元素的右节点,
                //表示栈顶元素的右节点还未遍历,则入栈
                }else if(cur.rightChild != null && pre != cur.rightChild){
                    stack.push(cur.rightChild);
                //3.最后,若栈顶元素的左右节点都已经被遍历或者为空,则出栈并打印,跟新最新打印节点
                }else{
                    System.out.println(stack.pop().data);
                    pre = cur;
                }
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java叉树归遍可以通过使用栈数据结构来实现。首先,我们创建一个空的栈,将根节点入栈。然后,我们进入一个循环,直到栈为空为止。在每一次循环中,我们弹出栈顶元素,并将其访问。接下来,如果该节点有右子节点,则将右子节点入栈。如果该节点有左子节点,则将左子节点入栈。由于栈是先进后出的数据结构,所以我们先入栈右子节点,再入栈左子节点,以确保在遍过程中先访问左子树节点。这样就能够实现叉树归遍。 以下是一个示例代码实现叉树归中序遍: ```java public void inorderTraversal(Node root) { if (root == null) { return; } Stack<Node> stack = new Stack<>(); Node current = root; while (current != null || !stack.isEmpty()) { while (current != null) { stack.push(current); current = current.leftChild; } current = stack.pop(); System.out.print(current.data + " "); // 访问节点 current = current.rightChild; } } ``` 在这个示例代码中,我们首先判断当前节点是否为空或者栈是否为空,如果不满足则进入循环。在循环内部,我们首先将当前节点及其所有左子节点入栈,直到当前节点为空。然后,我们弹出栈顶节点并访问该节点。最后,将当前节点更新为其右子节点,并继续下一次循环。 通过这种方式,我们可以实现叉树归中序遍。你可以根据需要修改代码实现其他类型的归遍,比如前序遍和后序遍。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [用Python实现叉树、二叉树归遍及绘制的例子](https://download.csdn.net/download/weixin_38618784/14869891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [java实现叉树树的归遍](https://blog.csdn.net/weixin_41826973/article/details/105555647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值