输出二叉树中中序遍历中给定结点的下一个结点
2017-05-25 10:44
211 查看
题目
输出二叉树中指定结点的下一个结点(即中序遍历的后继)。给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值,若不存在后继返回-1。
分析
中序遍历的非递归写法。第一步:中序遍历的非递归
BTNode* p = root; stack<BTNode*> s; while (!s.empty() || p) { //一直遍历到左子树最下边,边遍历边保存根节点到栈中 while (p) { s.push(p); p = p->lchild; } //当p为空时,说明已经到达左子树最下边,这时需要出栈了 if (!s.empty()) { p = s.top(); s.pop(); cout << setw(4) << p->data; //进入右子树,开始新的一轮左子树遍历 p = p->rchild; } }
第二步:边遍历边进行比较,完整代码如下
class Successor { public: int findSucc(TreeNode* root, int p) { // write code here if(root == nullptr) return -1; stack<TreeNode*> s; TreeNode *cur = root; bool flag = false; while(cur || !s.empty()){ while(cur){ s.push(cur); cur = cur->left; } if(!s.empty()){ TreeNode *q = s.top(); s.pop(); if(flag) return q->val; else if(q->val == p) flag = true; cur = q->right; } } return -1; } };
相关文章推荐
- 二叉树的层次,中序非递归遍历,以递归前序的方式构造二叉树,将二叉树中的e更新为d,输出从根结点出发 到指定结点,依次经过的祖先(即路径),由前序和中序还原二叉树
- 构造二叉树的抽象数据类型对于给定的先序序列和中序序列,构造二叉树,并按层输出所有结点内容,要求每层结点输出一行按层输出上述二叉树所表示的森林的所有结点内容
- 【数据结构作业四】以二叉链表作存储结构,建立一棵二叉树,并输出该二叉树的先序、中序、后序遍历序列、高度和其叶子结点数。
- 数据结构(C语言实现) - 二叉树的基本操作(建立,遍历,结点数,叶子结点数,高度,按树状打印,输出叶子结点等)
- 数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为0 1 2 的结点个数】
- 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
- 给定二叉树的前序遍历结果,输出所有可能的中序遍历的结果
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
- 剑指offer给定二叉树,求中序遍历的下一个 节点,前序遍历,后序遍历扩展
- 建一棵二叉树,能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数
- 给定二叉树的先序遍历和中序遍历,输出它的后序遍历序列
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回
- 先序顺序输入结点值创建二叉树,并按先序,中序和后序遍历输出
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回
- 输出二叉树中路径上结点值之和为给定值的所有路径
- 二叉树的下一个结点
- 剑指offer—二叉树的下一个结点
- 剑指offer(五十七)之二叉树的下一个结点
- 二叉树的下一个结点