左神算法基础班4_4_3在二叉树中找到一个节点的后继节点
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在二叉树中找到一个节点的后继节点相关推荐
- 左神算法基础班3_13深度拷贝含有随机指针的链表
Problem: 复制含有随机指针节点的链表 [题目] 一种特殊的链表节点类描述如下: public class Node { public int value; public Node next; ...
- 0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)
package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题.* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/ public c ...
- 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)
package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...
- 【搞定左神算法初级班】第4节:二叉树及相关常见面试题
目 录: 题目1:实现二叉树的先序.中序.后序遍历[递归方式和非递归方式] 题目2:在二叉树中找到一个节点的后继节点 题目3:介绍二叉树的序列化和反序列化 题目4:折纸问题 题目5:判断一棵二叉树是否 ...
- 左神算法初级班笔记4:二叉树
文章目录 01 | 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归 方式 1.递归版本: 2. 非递归版本: 02 | 在二叉树中找到一个节点的后继节点 03 | 介绍二叉树的序列化和反序列化 ...
- 《左神算法初级班》第四节课:二叉树结构
目录: 1)二叉树结构 2)二叉树的递归与非递归遍历 3)打印二叉树 4)判断搜索二叉树 5)判断完全二叉树 6)判断平衡二叉树 7)折纸问题 8)二叉树节点的前驱节点与后继节点 9)二叉树的序列化和 ...
- 左神算法中级班第三课[C++代码]
左神算法中级班第三课[C++代码] 第一题:流水线打包问题[阿里原题] 代码 第二题 代码 第三题:打印螺旋矩阵 代码 第四题 代码 第五题:判读aim是否在矩阵中 代码 第七题:topK问题 代码 ...
- java取余数的函数_左神算法基础:哈希函数和哈希表
笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...
- 左神算法进阶班5_3求公司的最大活跃度
[题目] 一个公司的上下节关系是一棵多叉树,这个公司要举办晚会,你作为组织者已经摸清了大家的心理: 一个员工的直接上级如果到场,这个员工肯定不会来. 每个员工都有一个活跃度的值,决定谁来你会给这个员工 ...
最新文章
- aida64副屏监控_“遥信”在电力监控系统中的重要作用
- 【错误记录】Google Play 上架报错 ( 您上传的 APK 没有经过 Zipalign 处理,请对 APK 运行 Zipalign 工具,然后重新上传。)
- 【转】找到 MySQL 数据库中的不良索引
- 开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面
- 系统架构师学习笔记-分布式系统
- matlab 积分方程组,请问用matlab怎么解这个定积分方程组
- c语言小游戏 flybird Easyx编程 项目源码讲解
- 内存带宽stream测试
- python模板是什么意思_python – 这个模板中的正确包含路径是什么?
- 软件外包公司到底干啥的?要不要去外包公司?
- Giant beast
- 64位处理器与32位处理器的区别
- oracle instr函数(oracle 用instr 来代替 like)
- mysql 别名 关键字_我们可以使用MySQL关键字作为列的别名吗?
- android问题解答
- 从零开始构建VUE 客户端和服务端SSR项目
- android仿微信下拉二楼_Android仿微信下拉列表实现
- Strstr和Strchr函数详解
- 美丽的海滨城市我们来啦-小强测试品牌
- cdn.bootcss.com挂了。访问超时,怎么办?
热门文章
- webapp 中为span元素赋值
- Charles-proxy-4.2.1-win64 - 破解
- SQL模糊查询 LIKE
- mybatis的逆向工程
- C#类型与SQLSEVER类型对比
- 实现Unicode和汉字的相互转换
- Oracle定时器调用存储过程
- iOS中js与objective-c的交互(转)
- WebPart的Web部件页部署时发生错误--小窍门
- (iPhone)怎样从photo album中获取所有图片 “****TWO*****” ---》 获取所有图片从Photo Album?...