zoukankan      html  css  js  c++  java
  • 寻找二叉树上从根结点到给定结点的路径

    1.递归实现

    public static boolean searchNode(TreeNode root,Stack<TreeNode> s,TreeNode node) {
            if(root == null) return false;
            s.push(root);
            if(root.val == node.val) return true;
            boolean b = false;
            //先去左子树找
            if(root.left != null) b = searchNode(root.left,s,node);
            //左子树找不到并且右子树不为空的情况下才去找
            if(!b && root.right != null) b = searchNode(root.right,s,node);
            //左右都找不到,弹出栈顶元素
            if(!b) s.pop();
            return b;
        }

    2.非递归实现

    思想:这个稍微有些复杂,当然也是要借助栈来完成。其实这里和二叉树的非递归先序遍历的思想差不多,只是在这个基础上进行一些改造。首先,新建一个栈,保存根节点。然后开始一直向左查找,查找的过程中把结点入栈。如果在向左找的过程中遇到了给定的结点,那么就输出并返回,这个过程比较好理解。关键是下面的弹栈的过程,如果在向左找的过程中遇到了null,说明当前栈顶元素的左子树为null。那么我们向栈顶元素的右子树开始查找。令p为栈顶元素,如果栈顶元素的右子树为null,那么弹出栈顶元素,并用pre来保存刚弹出的元素,之所以设置pre,是因为如果当前栈顶元素的右子树不为null的时候,不能轻易弹出,首先得去右子树上去查找,如果右孩子被弹出了,说明右子树上肯定没有,那么当前结点才可以弹出。

    主要是针对所有节点歇着向左下方搜索。

    public static void searchNode(TreeNode root,TreeNode node) {
            if(root == null || node == null) return;
            Stack<TreeNode> s = new Stack<>();
            TreeNode p = root;
            TreeNode pre = null; //上一次出栈的结点
            while(p != null || !s.isEmpty()) {
                while(p != null) {
                    //这个while循环的思想还是一直往左找,找的过程结点入栈,如果找到了就打印输出并返回。
                    s.push(p);
                    if(p.val == node.val) {
                        for (TreeNode treeNode : s) {
                            System.out.print(treeNode.val + " ");
                        }
                        return;
                    }
                    p = p.left;
                }
                //走到这一步说明栈顶元素的左子树为null,那么就开始往栈顶元素的右子树上去找。
                if(!s.isEmpty()) {
                    p = s.peek();
                    //如果栈顶元素的右子树为null,或者右子树被遍历过,则弹栈。
                    while(p.right == null || pre != null && p.right == pre) {
                        pre = s.pop();
                        p = s.peek();
                    }
                    //继续遍历p的右子树
                    p = p.right;
                }
            }
        }
    人生如修仙,岂是一日间。何时登临顶,上善若水前。
  • 相关阅读:
    关于AJAX与form表单提交数据的格式
    MongoDB
    Redis
    在django中使用django_debug_toolbar进行日志记录
    python第三方库,你要的这里都有
    Django之用户认证auth模块
    Django中常用命令
    form表单钩子,局部钩子和全局钩子
    当我开始爱自己
    FOR YOU
  • 原文地址:https://www.cnblogs.com/f-society/p/13633165.html
Copyright © 2011-2022 走看看