在二叉树中找到一个节点的后继节点

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {

    }
};
*/
class Solution
{
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(pNode == NULL)
        {
            return pNode;
        }

        if(pNode->right != NULL)
        {
            //后继节点就是右子树上最左的节点
            //找到后可提前返回
            return GetLeftMost(pNode->right);
        }
        else
        {
            //通过x找到父节点p,若x是p的左子树,则x的后继节点为p,若x是p的右子树,则继续向上找
            TreeLinkNode* parent = pNode->next;
            while(pNode != parent->left && parent != NULL)
            {
                parent = parent->next;
                pNode = pNode->next;
            }

            return parent;
        }
    }
private:
    TreeLinkNode* GetLeftMost(TreeLinkNode* pNode)
    {
        while(pNode->left != NULL)
        {
            pNode = pNode->left;
        }

        return pNode;
    }
};

原文地址:https://www.cnblogs.com/Manual-Linux/p/12082964.html

时间: 2024-07-28 22:57:37

在二叉树中找到一个节点的后继节点的相关文章

二叉树中删除一个节点

二叉树的删除可以算是二叉树最为复杂的操作,删除的时候要考虑到很多种情况: 1.被删除的节点是叶子节点 2.被删除的节点只有左孩子节点 3.被删除的节点只有右孩子节点 4.被删除的有两个孩子节点 所以在删除的时候,这4种情况都必须考虑进去,并且这4中情况之下,还会有细的划分,下面就细说怎么删除. 在二叉树中想要删除一个节点,首先需要找到这个节点,由于二叉树在插入节点的时候会遵循一个原则,就是利用节点的值来判断 节点将被插入的位置(或者给节点加一个key,用key来判断).从根节点开始往下走,比当前

基于中序遍历找到一个结点的后继结点

题目: 基于中序遍历找到一个结点的后继结点. 分析: 首先明白中序遍历,顺序为:左--->根----->右 如果当前结点为p. 有两种情况: 1.当p有右子树时,那么其右子树的最左结点即为所求: 2.当p没有右子树时.有以下两种情况: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"

019写程序在一棵二叉树中找到两个结点的最近共同祖先(keep it up)

写程序在一棵二叉树中找到两个结点的最近共同祖先. 分两种情况来讨论这个题: 第一种情况结点中没有指向父结点的指针 第二种情况接种有指向父节点的指针 我们先看第一种情况,结点中没有指向父结点的指针. 我们可以采用暴力搜索每一个结点,如果这个结点的子树中 有已知的两个结点,那我们就继续沿着左右子树找,如果左子树 能找到,我们就继续沿着左子树找,如果有子树能找到,我们就 沿着右子树找,不存在两个子树都能够找到. 代码: struct TreeNode {<pre name="code"

求二叉树中相差最大的两个节点间的差值绝对值

题目描述: 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值.请注意程序效率. solution: int findMinMax(BTNode *T) { if(!T) return 0; int max = INT_MIN; int min = INT_MAX; stack<BTNode*> s; s.push(T); while (!s.empty()) { BTNode *tmp = s.top(); if(tmp->d

【C语言】在两个数成对出现的数组中找到一个单独的数。

//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) { int i = 0; int ret = 0; for (i = 0; i < len; i++) { ret = ret^arr[i]; } return ret; } int main() { int arr1[] = { 1, 2, 2, 3, 1, 5, 3 }; int arr2[] =

二叉搜索树建立、插入、删除、前继节点、后继节点之c++实现

一.前言 一直以来,都对树有关的东西望而却步.以前每次说要看一看,都因为惰性,时间就那么荒废掉了.今天下个决心,决定好好的数据结构中的东西看一下.不知道看这篇文章的你,是不是和我有同样的感受,空有一颗努力的心,却迟迟没有付出行动.如果是的话,如果也想好好的把树的知识巩固一下的话,就让我们一起好好儿地把知识点过一遍吧.本文争取让看完的每一个没有基础的同学,都能有所收获.在正文开始前,先给自己加个油.加油(^ω^) 二.二叉搜索树的定义 二叉搜索树是指,对于某一个节点而言,它左边的节点都小于或等于它

求二叉搜索树的前驱节点和后继节点

前驱结点:节点val值小于该节点val值并且值最大的节点 后继节点:节点val值大于该节点val值并且值最小的节点 二叉树的节点val值是按照二叉树中序遍历顺序连续设定. 前驱结点 如图4的前驱结点是3 2的前驱结点是1 6的前驱结点是5 后继节点 7的后继结点是8 5的后继节点是6 2的后继节点是3 前驱节点 若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点(也就是左子树中所谓的rightMostNode) 若一个节点没有左子树,那么判断该节点和其父节点的关系 2.1 若

[算法]在数组中找到一个局部最小的位置

题目: 定义局部最小的概念.arr长度为1时,arr[0]是局部最小.arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]为局部最小.如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小.如果0<i<N-1,arr[i]<arr[i+1]&&arr[i]<arr[i-1],那么arr[i]是局部最小. 给定无序数组arr,已知arr中任何两个相邻的数不相等.写一个函数,只需返回arr中任何一个局部最小出现

&quot;Coding Interview Guide&quot; -- 在数组中找到一个局部最小的位置

[题目] 定义局部最小的概念:arr长度为1时,arr[0]是局部最小:arr的长度为N(N > 1)时,如果arr[0] < arr[1],那么arr[0]是局部最小,如果arr[N - 1] < arr[N - 2],那么arr[N - 1]是局部最小:如果0<i<N-1,既有arr[i] < arr[i-1], 又有arr[i] < arr[i+1],那么arr[i]是局部最小 给定无序数组arr,已知arr中任意两个相邻的数都不相等.写一个函数,只需返回a