【LeetCode】236. 二叉树的最近公共祖先、 JZ36 二叉搜索树与双向链表

 作者:小卢

 

专栏:《Leetcode》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》


 236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先

题目描述:

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

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

示例:

【LeetCode】236. 二叉树的最近公共祖先、 JZ36 二叉搜索树与双向链表_第1张图片

思路:

我们这里利用两个栈来存储p和q的路径,让将问题转换为链表相交问题

让大的先走差值步,然后同时走找到相同的节点返回

代码:

class Solution {
public:
        bool GetPath(TreeNode*root,TreeNode*x,stack&Path)
        {
            if(root==nullptr)
            return false;
            Path.push(root);
            if(x==root)
            return true;
            
            if(GetPath(root->left,x,Path))
                return true;
            if(GetPath(root->right,x,Path))
                return true;
            Path.pop();
            return false;

        }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        stackpPath,qPath;
        GetPath(root,p,pPath);
        GetPath(root,q,qPath);
        while(pPath.size()!=qPath.size())
        {
            if(pPath.size()>qPath.size())
            pPath.pop();
            else
            qPath.pop();
        }
        while(pPath.top()!=qPath.top())
        {
            pPath.pop();
            qPath.pop();
        }
        return pPath.top();
    }
};

 JZ36 二叉搜索树与双向链表

二叉搜索树与双向链表_牛客题霸_牛客网

 题目描述:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

【LeetCode】236. 二叉树的最近公共祖先、 JZ36 二叉搜索树与双向链表_第2张图片


要求:空间复杂度O(1)(即在原树上操作),时间复杂度 O(n)

注意:

1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构

4.你不用输出双向链表,程序会根据你的返回值自动打印输出

示例:

【LeetCode】236. 二叉树的最近公共祖先、 JZ36 二叉搜索树与双向链表_第3张图片

思路:

利用中序遍历更改节点的指向

代码:

class Solution {
public:
    void _Convert(TreeNode*&prev,TreeNode*cur)
	{
		if(cur==nullptr)
		return ;
		
		_Convert(prev,cur->left);
		//root
			cur->left=prev;
			if(prev)
		    prev->right=cur;
			prev=cur;
		
		_Convert(prev,cur->right);
	} 

    TreeNode* Convert(TreeNode* pRootOfTree) {
        TreeNode*prev=nullptr;
		TreeNode*cur=pRootOfTree;
		
		_Convert(prev,cur);
		TreeNode*head=pRootOfTree;
		while(head&&head->left)
		{
			head=head->left;
		}
		return head;
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)