W11 BinaryTree

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这段代码实现了一个生成哈夫曼树的函数,使用了模板类和优先队列的数据结构,以下是对这段代码的解释: ```c++ template<class Type> class Huffman { friend BinaryTree<int> HuffmanTree(Type [], int); public: operator Type () const { return weight; } private: BinaryTree<int> tree; Type weight; }; template <class Type> BinaryTree<int> HuffmanTree(Type f[], int n) { Huffman<Type> *w = new Huffman<Type>[n + 1]; BinaryTree<int> z, zero; for (int i = 1; i <= n; i++) { z.MakeTree(i, zero, zero); w[i].weight = f[i]; w[i].tree = z; } //建优先队列 MinHeap<Huffman<Type>> Q(1); Q.Initialize(w, n, n); //反复合并最小频率树 Huffman<Type> x, y; for (int i = 1; i < n; i++) { Q.DeleteMin(x); Q.DeleteMin(y); z.MakeTree(0, x.tree, y.tree); x.weight += y.weight; x.tree = z; Q.Insert(x); } Q.DeleteMin(x); Q.Deactivate(); delete[] w; return x.tree; } ``` 这段代码定义了一个模板类 `Huffman`,这个类代表了哈夫曼树的每个节点。它包含了一个二叉树 `tree` 和一个权重 `weight`。类模板 `Huffman` 中的 `friend` 声明了 `HuffmanTree` 函数是 `Huffman` 类的友元函数,可以访问 `Huffman` 类的私有成员。 函数 `HuffmanTree` 接受一个权重数组 `f` 和一个整数 `n`,返回一个哈夫曼树。这个函数首先创建了一个 `Huffman` 对象数组 `w`,用于存储每个数据项的权重和对应的单节点树。然后使用二叉树 `zero` 创建了一个空节点树 `z`,循环遍历每个数据项 `i`,将其权重赋值给 `w[i].weight`,将 `z` 赋值给 `w[i].tree`。 接下来,使用 `MinHeap` 类模板定义了一个优先队列 `Q`,用于合并单节点树。`MinHeap` 是一个最小堆的类模板,其中使用了 `Huffman` 类作为数据类型,第一个参数 `1` 表示使用默认构造函数进行初始化。 在循环中,每次从 `Q` 中删除两个权重最小的单节点树 `x` 和 `y`,使用 `MakeTree` 函数将 `x.tree` 和 `y.tree` 合并成一个新的树 `z`,将 `x.weight` 和 `y.weight` 相加得到新的权重 `x.weight += y.weight`,将 `x.tree` 赋值为合并后的树 `z`,将 `x` 重新插入到 `Q` 中。最后,从 `Q` 中删除最后一个单节点树 `x`,将 `x.tree` 作为哈夫曼树返回。 希望这个解释能够帮助你理解这段代码的含义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值