zoukankan      html  css  js  c++  java
  • 二叉树的最近公共祖先

    此博客链接:https://www.cnblogs.com/ping2yingshi/p/14136543.html

    二叉树的最近公共祖先

    题目链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/

    题目

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

    例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

    示例 1:

    输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
    输出: 3
    解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
    示例 2:

    输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
    输出: 5
    解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

    题解

    思路:先从根节点开始访问给的节点,然后和给的数进行比较,如果给的数和节点中的值相等,则返回这个节点即为最近公共祖先,这里使用层次遍历。如果当前节点没有和给定的值相等,则看当前节点的左子树和右子树是否有相等的节点。如果有的话,则当前几点则为最近的公共节点。

    代码

    错误代码1

    class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            Queue<TreeNode> queue=new LinkedList();
            queue.add(root);
            while(!queue.isEmpty()){
                TreeNode temp=queue.poll();
                if(p==temp)
                   return p;
                if(q==temp)
                   return q;
                if((temp.left==p&&temp.right==q)||(temp.left==q&&temp.right==p))
                {
                    return temp;
                }
               
                if(temp.left!=null)
                    queue.add(temp.left);
                if(temp.right!=null)
                    queue.add(temp.right);
    
            }
            return null;
        }
    }

     我看看感觉我代码有特别大问题,看了一些题解,基本都是使用深度优先遍历的,是不是我这广度优先遍历有点不照啊。我边界条件考虑的太少了。

     

    出来混总是要还的
  • 相关阅读:
    4.23Java自定义链表最终封装与完善
    4.23Java vector向量
    托管与非托管
    关于C#中的DLLImport (引)
    C#中通过DllImport使用 Win32 API(引)
    ASP.Net HttpHandler (转)
    C#WinForm获取本机网卡的型号,IP地址,子网掩码和网关
    ManagementObject
    asp.net Session详解(再转)
    C#优化字符串操作(引)
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14136543.html
Copyright © 2011-2022 走看看