Description
1、给出后序遍历序列###ca##ji####spom(#代表空指针), 构建二叉树。
2、上述二叉树实际是一颗二叉排序树,请实现程序
(1)查找c节点,输出从树根到c节点的路径。
(2)删除其中的m节点,使得删除后仍为二叉排序树,并输出其中序遍历序列。
Input
输入后序遍历序列;
输入要查找的节点值;
输入要删除的节点值。
Output
输出构建好的二叉树的中序遍历序列(末尾有空格);
输出从树根到要查找节点的路径(末尾有空格);
输出删除节点后的二叉树的中序遍历序列(末尾有空格)
#include<iostream>
#include<string>
using namespace std;
typedef struct TNode
{
char val;
struct TNode* left;
struct TNode* right;
} BinTree;
BinTree* BuildTree(BinTree* &(Root),string Post,int& index)
{
if (index>=0)
{
if (Post[index]=='#')
{
Root=NULL;
}
else
{
Root=new BinTree;
Root->val=Post[index];
BuildTree(Root->right,Post,--index);
BuildTree(Root->left,Post,--index);
}
}
return Root;
}
BinTree* Search(BinTree* Root,char target)
{
if (Root!=NULL)
{
if (Root->val==target)
{
cout<<Root->val<<" "<<endl;
return Root;
}
else
{
cout<<Root->val<<" ";
if (target<Root->val)
{
return Search(Root->left,target);
}
else
{
return Search(Root->right,target);
}
}
}
return NULL;
}
BinTree* FindMin(BinTree* Root)
{
if (!Root)
{
return NULL;
}
else if (!Root->left)
{
return Root;
}
else
{
return FindMin(Root->left);
}
}
BinTree* Delete(BinTree* Root,char X)
{
BinTree* Tmp;
if (Root)
{
if (X<Root->val)
{
Root->left=Delete(Root->left,X);
}
else if (X>Root->val)
{
Root->right=Delete(Root->right,X);
}
else
{
if (Root->left&&Root->right)
{
Tmp=FindMin(Root->right);
Root->val=Tmp->val;
Root->right=Delete(Root->right,Root->val);
}
else
{
Tmp=Root;
if (!Root->left)
{
Root=Root->right;
}
else
{
Root=Root->left;
}
delete Tmp;
}
}
}
return Root;
}
void Traverse(BinTree* Root)
{
if (Root)
{
Traverse(Root->left);
cout<<Root->val<<" ";
Traverse(Root->right);
}
}
int main()
{
BinTree* Root=NULL;
string Post;
cin>>Post;
char x,y;
cin>>x>>y;
int index=0;
while (Post[index])
{
index++;
}
index=index-1;
Root=BuildTree(Root,Post,index);
Traverse(Root);
cout<<endl;
Search(Root,x);
Root=Delete(Root,y);
Traverse(Root);
cout<<endl;
return 0;
}
Input
###ca##ji####spom
c
m
Output
a c i j m o p s
m i a c
a c i j o p s