Problem:
  在二叉树中找到一个节点的后继节点
  【题目】 现在有一种新的二叉树节点类型如下:
  public class Node {
  public int value;
  public Node left;
  public Node right;
  public Node parent;
  public Node(int data) { this.value = data; }
  }
  该结构比普通二叉树节点结构多了一个指向父节点的parent指针。
  假设有一 棵Node类型的节点组成的二叉树,
  树中每个节点的parent指针都正确地指向自己的父节点,
  头节点的parent指向null。只给一个在二叉树中的某个节点 node,
  请实现返回node的后继节点的函数。在二叉树的中序遍历的序列中,
  node的下一个节点叫作node的后继节

Solution:
  在中序遍历的顺序中,每一个节点的后一个节点即为该节点的后继节点,
  先驱节点即为中序顺序的前面节点。

  节点x的后继节点为:
    【若有右子树】即为该节点的右子树最左的节点
    【若无右子树】:
      通过前驱指针,向上回溯父节点,并判断该节点是否为该父节点的左子树,
      若是,则该父节点为该节点的后继节点。不是,父节点继续向上回溯其父。
      若一直找不到,则该节点的后继节点为空。

Code:

  

  1 #pragma once
  2 #include <iostream>
  3 #include <vector>
  4 #include <queue>
  5
  6 using namespace std;
  7
  8 struct Node
  9 {
 10     int val;
 11     Node* lchild;
 12     Node* rchild;
 13     Node* parent;
 14     Node(int a = -1) :val(a), lchild(NULL), rchild(NULL),parent(NULL) {}
 15 };
 16
 17 void Create(Node*& root, vector<int>num)//层序构造树
 18 {
 19     queue<Node*>q;
 20     root = new Node(num[0]);
 21     q.push(root);
 22     int i = 1;
 23     while (i < num.size() && !q.empty())
 24     {
 25         Node* p = q.front();
 26         q.pop();
 27         if (!p)//空节点p
 28             break;
 29         if (num[i] > 0)
 30         {
 31             p->lchild = new Node(num[i++]);
 32             p->lchild->parent = p;
 33         }
 34         if (num[i] > 0)
 35         {
 36             p->rchild = new Node(num[i++]);
 37             p->rchild->parent = p;
 38         }
 39         q.push(p->lchild);
 40         q.push(p->rchild);
 41     }
 42 }
 43
 44 void MidTravel(Node *root)
 45 {
 46     if (!root)
 47         return;
 48     MidTravel(root->lchild);
 49     cout << root->val << "  ";
 50     MidTravel(root->rchild);
 51 }
 52
 53 Node* FindNode(Node* node)
 54 {
 55     if (node->rchild)//有右子树,那么后继节点即为右子树的最左的节点
 56     {
 57         Node* p = node->rchild;
 58         while (p->lchild)
 59             p = p->lchild;
 60         return p;
 61     }
 62     //无右子树
 63     //后继节点为该节点为某个父节点的左子树
 64     Node *f;//父亲指针
 65     f = node->parent;
 66     while (!f)
 67     {
 68         if (node == f->lchild)
 69             return f;
 70         node = f;
 71         f = node->parent;
 72     }
 73     return NULL;
 74 }
 75
 76 void Test()
 77 {
 78     Node* root = NULL;
 79     vector<int>num = { 1,2,3,4,5,6,7,8,9,10,11,12,-1,-1,-1 };
 80     Create(root, num);//层序构造树
 81
 82     cout << "=============查看中序遍历==============" << endl;
 83     MidTravel(root);
 84     cout << endl << endl;
 85
 86     Node* p = NULL;
 87     p = root->rchild;
 88     cout << "节点 " << p->val << " 的后继节点为:";
 89     p = FindNode(p);
 90     if (p)
 91         cout << p->val << endl;
 92     else
 93         cout << "空。" << endl;
 94
 95     p = root->lchild->rchild;
 96     cout << "节点 " << p->val << " 的后继节点为:";
 97     p = FindNode(p);
 98     if (p)
 99         cout << p->val << endl;
100     else
101         cout << "空。" << endl;
102
103     p = root->rchild->rchild;
104     cout << "节点 " << p->val << " 的后继节点为:";
105     p = FindNode(p);
106     if (p)
107         cout << p->val << endl;
108     else
109         cout << "空。" << endl;
110
111 }
112         

转载于:https://www.cnblogs.com/zzw1024/p/10994766.html

左神算法基础班4_4_3在二叉树中找到一个节点的后继节点相关推荐

  1. 左神算法基础班3_13深度拷贝含有随机指针的链表

    Problem: 复制含有随机指针节点的链表 [题目] 一种特殊的链表节点类描述如下: public class Node { public int value; public Node next; ...

  2. 0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)

    package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题.* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/ public c ...

  3. 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)

    package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...

  4. 【搞定左神算法初级班】第4节:二叉树及相关常见面试题

    目 录: 题目1:实现二叉树的先序.中序.后序遍历[递归方式和非递归方式] 题目2:在二叉树中找到一个节点的后继节点 题目3:介绍二叉树的序列化和反序列化 题目4:折纸问题 题目5:判断一棵二叉树是否 ...

  5. 左神算法初级班笔记4:二叉树

    文章目录 01 | 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归 方式 1.递归版本: 2. 非递归版本: 02 | 在二叉树中找到一个节点的后继节点 03 | 介绍二叉树的序列化和反序列化 ...

  6. 《左神算法初级班》第四节课:二叉树结构

    目录: 1)二叉树结构 2)二叉树的递归与非递归遍历 3)打印二叉树 4)判断搜索二叉树 5)判断完全二叉树 6)判断平衡二叉树 7)折纸问题 8)二叉树节点的前驱节点与后继节点 9)二叉树的序列化和 ...

  7. 左神算法中级班第三课[C++代码]

    左神算法中级班第三课[C++代码] 第一题:流水线打包问题[阿里原题] 代码 第二题 代码 第三题:打印螺旋矩阵 代码 第四题 代码 第五题:判读aim是否在矩阵中 代码 第七题:topK问题 代码 ...

  8. java取余数的函数_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  9. 左神算法进阶班5_3求公司的最大活跃度

    [题目] 一个公司的上下节关系是一棵多叉树,这个公司要举办晚会,你作为组织者已经摸清了大家的心理: 一个员工的直接上级如果到场,这个员工肯定不会来. 每个员工都有一个活跃度的值,决定谁来你会给这个员工 ...

最新文章

  1. aida64副屏监控_“遥信”在电力监控系统中的重要作用
  2. 【错误记录】Google Play 上架报错 ( 您上传的 APK 没有经过 Zipalign 处理,请对 APK 运行 Zipalign 工具,然后重新上传。)
  3. 【转】找到 MySQL 数据库中的不良索引
  4. 开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面
  5. 系统架构师学习笔记-分布式系统
  6. matlab 积分方程组,请问用matlab怎么解这个定积分方程组
  7. c语言小游戏 flybird Easyx编程 项目源码讲解
  8. 内存带宽stream测试
  9. python模板是什么意思_python – 这个模板中的正确包含路径是什么?
  10. 软件外包公司到底干啥的?要不要去外包公司?
  11. Giant beast
  12. 64位处理器与32位处理器的区别
  13. oracle instr函数(oracle 用instr 来代替 like)
  14. mysql 别名 关键字_我们可以使用MySQL关键字作为列的别名吗?
  15. android问题解答
  16. 从零开始构建VUE 客户端和服务端SSR项目
  17. android仿微信下拉二楼_Android仿微信下拉列表实现
  18. Strstr和Strchr函数详解
  19. 美丽的海滨城市我们来啦-小强测试品牌
  20. cdn.bootcss.com挂了。访问超时,怎么办?

热门文章

  1. webapp 中为span元素赋值
  2. Charles-proxy-4.2.1-win64 - 破解
  3. SQL模糊查询 LIKE
  4. mybatis的逆向工程
  5. C#类型与SQLSEVER类型对比
  6. 实现Unicode和汉字的相互转换
  7. Oracle定时器调用存储过程
  8. iOS中js与objective-c的交互(转)
  9. WebPart的Web部件页部署时发生错误--小窍门
  10. (iPhone)怎样从photo album中获取所有图片 “****TWO*****” ---》 获取所有图片从Photo Album?...