C++求解二叉树的下一个结点问题
目录
- 题目描述
- 解题思路
- 测试代码
- 1)暴力破解
- 2)结合中序排序性质
题目描述 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
文章图片
示例:
输入:{8,6,10,5,7,9,11},8
返回:9
解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11},后台只打印子树的下一个节点,所以只会打印9,如下图,其实都有指向左右孩子的指针,还有指向父节点的指针,下图没有画出来
文章图片
数据范围:节点数满足1≤n≤50,节点上的值满足1≤val≤100
要求:空间复杂度 O(1),时间复杂度 O(n)
示例:
输入:
{8,6,10,5,7,9,11},8
返回值:
9
解题思路 本题考察数据结构树的使用。两个方法:
1)暴力破解。通过next指针获取根结点,对其进行中序排序,排序过程中用vector存储,然后直接根据位置输出即可。
2)结合中序排序性质。若某个结点存在右子树,则右子树的最左孩子就是它的下一个结点;若不存在右子树,则它的第一个右父亲,就是它的下一个结点。
测试代码
1)暴力破解
/*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)return NULL; // 确定根结点TreeLinkNode* root=pNode; while(root->next){root=root->next; }// 中序排序vectorv; inorder(root,v); for(int i=0; i &v){if(!root)return; // 中序排序inorder(root->left,v); v.push_back(root); inorder(root->right,v); }};
2)结合中序排序性质
/*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)return NULL; // 判断是否存在右子树if(pNode->right){TreeLinkNode* target=pNode->right; // 取最左孩子while(target->left){target=target->left; }return target; }// 不存在右子树,寻找第一个右父亲while(pNode->next){if(pNode->next->left==pNode)return pNode->next; pNode=pNode->next; }return NULL; } };
【C++求解二叉树的下一个结点问题】到此这篇关于C++求解二叉树的下一个结点问题的文章就介绍到这了,更多相关C++二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 【C/C++】C语言基础知识【第二版】
- 求解COP 5536
- C/C++程序员进阶课堂|纯新网络编程教学
- C++面向对象程序设计
- C++分布式系统——《开题》
- c++|2022/3/29 每日思维
- 蓝桥杯|蛇形填数【第十一届蓝桥杯B组(C\C++)】
- 《C++要笑着学》|【C++要笑着学】从零开始实现日期类 | 体会代码的复用 | 提供完整代码
- 学习态度|为什么C++比C语言麻烦这么多,程序员笑了(这些点你知道吗())
- 《C语言杂俎》|【C++】几道关于this指针的面试题