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

题目:

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

分析:

首先明白中序遍历,顺序为:左--->根----->右

如果当前结点为p。

有两种情况:

1.当p有右子树时,那么其右子树的最左结点即为所求:

2.当p没有右子树时。有以下两种情况:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

沿着p向上找,假设p的父结点的左孩子是p。那么该父结点即为所求。否则继续向上找。

代码:

/*
找到中序遍历下一个结点的后继结点
by Rowandjj
2014/8/19
*/
#include<iostream>
using namespace std;
typedef struct _NODE_
{
	int data;
	struct _NODE_ *left;
	struct _NODE_ *right;
	struct _NODE_ *parent;
}Node,*pNode,*pTree;
//找到中序遍历时,p的后继结点
pNode after(pNode p)
{
	if(p == NULL)
	{
		return NULL;
	}
	if(p->right != NULL)//存在右子树
	{//找到右子树中的最左结点
		pNode pTemp = p->right;
		while(pTemp->left)
		{
			pTemp = pTemp->left;
		}
		return pTemp;
	}else//不存在右子树
	{//那么找到该结点的父结点,若当前结点是父结点的左孩子那么父结点即为所求
		//否则继续向上寻找
		pNode pParent = p->parent;
		while(pParent && pParent->right == p)
		{
			p = pParent;
			pParent = p->parent;
		}
		return pParent;
	}
}
//构建
void create(pTree *pRoot,pNode pParent)
{
	int data;
	cin>>data;
	if(data == -1)
	{
		return;
	}
	*pRoot = (pNode)malloc(sizeof(Node));
	if(*pRoot == NULL)
	{
		exit(-1);
	}
	(*pRoot)->data = data;
	(*pRoot)->left = NULL;
	(*pRoot)->right = NULL;
	(*pRoot)->parent = pParent;
	create(&(*pRoot)->left,*pRoot);
	create(&(*pRoot)->right,*pRoot);
}
//中序遍历
void display(pTree pRoot)
{
	if(pRoot == NULL)
	{
		return;
	}
	if(pRoot->left != NULL)
	{
		display(pRoot->left);
	}
	cout<<pRoot->data<<" ";
	if(pRoot->right != NULL)
	{
		display(pRoot->right);
	}
}
int main()
{
	pTree pTree = NULL;
	create(&pTree,NULL);
// 	pNode p1 = pTree->left->right;
// 	cout<<p1->data<<endl;
// 	cout<<p1->parent->data<<endl;
//	cout<<after(pTree)->data;
	//cout<<after(pTree->left->right)->data<<endl;
	cout<<after(pTree->left)->data<<endl;
	display(pTree);
	return 0;
}
时间: 2024-10-23 18:38:15

基于中序遍历找到一个结点的后继结点的相关文章

二叉树中序遍历的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路:分多种情况讨论 1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *left; 5 struct TreeLinkNode *right; 6 struct TreeLinkNode *next; 7 TreeLinkNode(int x) :val(x), left(NU

根据前序和中序遍历求后序 /后序和中序求前序

给出一二叉树的前序遍历的顺序和中序遍历的顺序我们可以由此得出后序遍历的顺序,根据它们的访问顺序,前序遍历的第一个结点肯定是根结点,与之对应在中序遍历找到对应的根结点的位置,那么在中序遍历中,根结点的左边的元素都属于左子树的元素,根结点右边的元素都属于右子树的元素,之后把左子树当成一个继续操作,就这样可以推出整个树,继而求出后序遍历: #include<iostream> #include<cstdlib> #include<cstring> #include<cs

根据先序遍历中序遍历重建二叉树

根据先序遍历和中序遍历的特点,我们想到了采用递归的方法来实现. 思路:1) 代码的容错性检查,比如:先序遍历和中序遍历长度应相等 2) 先保存先序遍历的第一个点,这个点为结点,接下来循环中序遍历,直到midOrd[index]=该结点,那么接下来就可以采用递归,分别对结点左边和右边的序列采用相同的方法. 3) 直到中序遍历中的序列中只含一个点,整个过程结束. 下面是我写的代码,一直显示错误,不知道什么原因. // 先序中序重建二叉树.cpp : Defines the entry point f

Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。

You are to determine the value of the leaf node in a given binary tree that is the terminal node of a path of least value from the root of the binary tree to any leaf. The value of a path is the sum of values of nodes along that path. Input The input

PAT A1020——已知后序中序遍历求层序遍历

1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree. Input

数据结构35:二叉树前序遍历、中序遍历和后序遍历

递归算法底层的实现使用的是栈存储结构,所以可以直接使用栈写出相应的非递归算法. 先序遍历的非递归算法 从树的根结点出发,遍历左孩子的同时,先将每个结点的右孩子压栈.当遇到结点没有左孩子的时候,取栈顶的右孩子.重复以上过程. 实现代码函数: // 先序遍历非递归算法 void PreOrderTraverse(BiTree Tree){ BiTNode *a[20]; // 定义一个顺序栈 BiTNode *p; // 临时指针 push(a, Tree); // 根结点进栈 while (top

二叉树先序遍历中序遍历求后序遍历

先序遍历:根 左 右 中序遍历:左 根 右 后序遍历:左 右 根 我们可以先从先序遍历中找到根节点,由于知道了根节点那么可以依靠中序遍历找到左子树,右子树.这样再去先序遍历中找到左子树的根节点,然后再依靠中序遍历找到左子树的左子树(右子树同理).这样层层递归就能还原二叉树.之后求出后序遍历. 感谢原博主http://www.cnblogs.com/rain-lei/p/3576796.html 一开始递归不会写,看了博主的发现其实很简单.注意还原二叉树时return root. #include

bzoj 2770 堆的中序遍历性质

我们知道二叉搜索树的中序遍历是一个已经排好序的序列,知道序列我们无法确定树的形态(因为有多种). 但是,Treap如果告诉我们它的关键字以及权值,那么就可以唯一确定树的形态(Treap的O(logn)的期望时间复杂度就是依靠一个随机堆的深度不会太深) 具体的,已知关键字序列:k1,k2,k3...kn和优先级序列:p1,p2,p3,...pn, 如果我们想要找ki的父亲,只需要找“左边第一个p比它大的和右边第一个p比它大的中,p较小的那个“ 至于lca(ki,kj),是对应的pi~pj中的最小值

94. 二叉树的中序遍历

94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public Li