树、递归、遍历————二叉搜索树的最近公共祖先

可以根据二叉搜索树的特点来进行解题:

  • 二叉搜索树左边节点的值小于根节点
  • 右边节点的值大于根节点。

所以左右都小于根节点的值说明在左子树上

左右的值大于根节点的值就代表值在右子树上

介于两者中间则输入的本身就是根节点,即为最近公共祖先。

一、遍历

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
13         if(root==NULL) return NULL;
14         bool flag=true;
15         while(flag){
16             //两个值都小于根节点的值,则在左子树上面
17             if(root->val > p->val && root->val > q->val) root=root->left;
18             //都大于根节点值,则在右子树上面
19             else if(root->val < p->val && root->val < q->val) root=root->right;
20             else
21                 flag = false;//要么其中一个节点=根节点,要么这两个节点分别在两颗子树上,那么直接返回根节点就行了
22         }
23         return root;
24     }
25 };

二、递归

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
13         //首先先看是否是空树
14         if(root==NULL) return NULL;
15         //递归的终止条件:如果根节点就是p或者q,那个就返回根节点啊
16         if(root==p || root==q) return root;
17         //开始递归,递归的逻辑是从倒数第二步开始推
18         //找节点是q或p的
19         TreeNode* left = lowestCommonAncestor(root->left,p,q);
20         TreeNode* right = lowestCommonAncestor(root->right,p,q);
21         //倒数第二步来看,左右都是NULL,说明没有子节点等于p或q,那么就直接返回root就行了
22         //但是实际上已经说了p、q是在二叉树里面的,所以这种情况可以抛弃
23         if(left!=NULL && right !=NULL) return root;
24         //左非空,右空,那么这个left是最近的了
25         else if(left != NULL) return left;
26         else if(right != NULL) return right;
27         return NULL;
28     }
29 };

原文地址:https://www.cnblogs.com/pacino12134/p/11073726.html

时间: 2024-11-08 09:56:12

树、递归、遍历————二叉搜索树的最近公共祖先的相关文章

LeetCode 235. 二叉搜索树的最近公共祖先(Lowest Common Ancestor of a Binary Search Tree) 32

235. 二叉搜索树的最近公共祖先 235. Lowest Common Ancestor of a Binary Search Tree 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)." 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,nul

leetcode 235. 二叉搜索树的最近公共祖先(c++)

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先).” 例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6 解释: 节点

【leetcode 简单】 第六十八题 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)." 例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5] _______6______ / ___2__ ___8__ / \ / 0 _4 7 9 / 3 5 示例 1: 输入: root

二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先).” 例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6 解释: 节点

235. 二叉搜索树的最近公共祖先

题目链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/submissions/ 解题思路: 如果p和q都小于root,去左边找就行. 如果p和q在两侧的,直接就是root,这个可以通过val来判断. 1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * Tr

进阶实验8-2.3 二叉搜索树的最近公共祖先 (30分)

解题思路: 1.定义一个结构体,来存储二叉排序树 typedef struct { int data; int left; int right; int parent; int h; } T; 2.再定义一个结构体,将输入数据存入 typedef struct { int data; int pos; } Info; 3.对输入数据排序 4.用二分法确实查询数据是否存在树中 5.寻找最近公共祖先 1)如果x,y均不是根结点 1.1.如果x==y,则x是y的祖先 1.2.若x,y分别在左右子树,则

判断一棵树是否为二叉搜索树(二叉排序树) python

输入一棵树,判断这棵树是否为二叉搜索树.首先要知道什么是排序二叉树,二叉排序树是这样定义的,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: (4)没有键值相等的节点 #方法1,直接判断 直接判断的关键在于不能只是单纯地判断根.左.右三个节点的大小关系,左子树的右节点不仅要大于父节点,还要小于父节点的父节点,右子树的左节点

数据结构学习笔记04树(二叉树、二叉搜索树、平衡二叉树)

一.树 树的基本术语 ①结点的度(Degree):结点的子树个数 ②树的度:树的所有结点中最大的度数 ③叶结点(Leaf):度为0的结点 ④父结点(Parent):有子树的结点是其子树的根结点的父结点 ⑤子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点:子结点也称孩子结点. ⑥兄弟结点(Sibling):具有同一父结点的各结点彼此是兄弟结点. ⑦路径和路径长度:从结点n1到nk的路径为一个结点序列n1 , n2 ,… , nk , ni是 ni+1的父结点.路径所包含边

判断一棵树是否是二叉搜索树

前两天写过一篇博文<二叉搜索树基本操作实现>,为了更深入了解二叉搜索树的性质,本文实现判断一棵树是否为二叉搜索树算法. 二叉搜索树的性质: 任意节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值. 构造二叉树的节点定义为: struct TreeNode{ int data; TreeNode *left; TreeNode *right; }; 方法1 (错误) 对每一个节点,检测其值是否大于左子树节点,是否小于右子树节点.思路很简单,代码实现如下: bool