后序遍历构建二叉树+查找打印路径+删除

给出后序遍历序列###ca##ji####spom, 构建二叉树。
上述二叉树实际是一颗二叉排序树,请实现程序
查找c节点,输出从树根到c节点的路径。
删除其中的m节点,使得删除后仍为二叉排序树。

头文件 Binary_node.h 构建二叉树节点

#include<iostream>
struct Binary_node 
{
 char ch;
 struct Binary_node* left; //指向左孩子的指针
 struct Binary_node* right; //指向右孩子的指针
 Binary_node(); //默认的不带参数的构造函数
 Binary_node(char& x); //带有一个参数的构造函数
};
typedef struct Binary_node* ptr;

Binary_node.cpp 节点的实现

#include "Binary_node.h"
Binary_node::Binary_node() 
{
 left = NULL;
 right = NULL;
}
Binary_node::Binary_node(char& x) 
{
 ch = x;
 left = NULL;
 right = NULL;
}

Binary_tree.h 定义二叉树的类

#include "Binary_node.h"
#include<iostream>
using namespace std;
typedef struct Binary_node* ptr;
class Binary_tree {
public:
 Binary_tree();
 void postorder(void (*visit)(char&));
 void BuildTree_Postorder(ptr& aroot, string& postorder, int& index);
 ptr root;
protected:
 void recursive_postorder(ptr& sub_root, void (*visit)(char&));
 int count;
};

Binary_tree.cpp 二叉树的实现

#include "Binary_tree.h"
typedef struct Binary_node* ptr;
Binary_tree::Binary_tree()
{
 root = NULL;
 count = 0;
}
void Binary_tree::postorder(void (*visit)(char&))
{
 recursive_postorder(root, visit);
}
void Binary_tree::recursive_postorder(ptr& sub_root, void (*visit)(char&))
{
 if (sub_root != NULL) 
 {
  recursive_postorder(sub_root->left, visit);
  recursive_postorder(sub_root->right, visit);
  (*visit)(sub_root->ch);
 }
}
void Binary_tree::BuildTree_Postorder(ptr& aroot, string& postorder, int& index)
{
 if (index>=0)
 {
  if (postorder[index] == '#')
   aroot = NULL;
  else 
  {
   aroot = new Binary_node;
   aroot->ch = postorder[index];
   BuildTree_Postorder(aroot->right, postorder, --index);
   BuildTree_Postorder(aroot->left, postorder, --index);
  }
 }
}
``
继承实现二分查找树 Search_tree.h

```cpp
#include "Binary_tree.h"
enum Error_code{success,not_present};
class Search_tree: public Binary_tree
{
public:
 Error_code insert(char &new_data);
 void remove(Binary_node*& root,char &target);
 void tree_search(Binary_node*& root,char &target);
 //ptr search_root;
private: 
    Binary_node* search_for_node(Binary_node*& sub_root, char& target); 
    Error_code remove_root(Binary_node*& sub_root);
    Error_code search_and_destroy(Binary_node*& sub_root,char& target);
};

Search_tree.cpp 二分查找树的实现

#include"Search_tree.h"
void Search_tree::tree_search(Binary_node*& root,char &target)
{
	Binary_node* found = search_for_node(root, target);
	if (found == NULL)
		cout<<"false";
	else
		cout<<"true";
}
Binary_node* Search_tree::search_for_node(Binary_node*& sub_root,char &target) 
{
	if (sub_root == NULL||sub_root->ch == target)
	{
		cout<<sub_root->ch;
		return sub_root;
	}
	else if (sub_root->ch < target)
	{
		cout<<sub_root->ch;
		return search_for_node(sub_root->right, target);
	}
	else 
	{
		cout<<sub_root->ch;
		return search_for_node(sub_root->left, target);
	}
}

void Search_tree::remove(Binary_node*& root,char& target)
{
	Error_code result=search_and_destroy(root,target);
	if(result==success)
	count--;
	else
	cout<<"false";
}
Error_code Search_tree::search_and_destroy(Binary_node*& sub_root,char &target)
{
	if (sub_root == NULL || sub_root->ch == target)
		return remove_root(sub_root);
	else if (target < sub_root->ch)
		return search_and_destroy(sub_root->left, target);
	else
		return search_and_destroy(sub_root->right, target);
}
Error_code Search_tree::remove_root(Binary_node*& sub_root)
{
	//删除左边子树最右边的孩子 
	//没有子树 
	if (sub_root == NULL) 
		return not_present;
	Binary_node* to_delete = sub_root;
	//只有一棵子树为空 
    if (sub_root->right == NULL) 
		sub_root = sub_root->left;
	else if (sub_root->left == NULL) 
		sub_root = sub_root->right;
	else 
	{ 
		//两棵子树都不是空的
		to_delete = sub_root->left;
		Binary_node* parent = sub_root;
		while (to_delete->right != NULL) { 
			parent = to_delete;
			to_delete = to_delete->right;
		} 
		sub_root->ch = to_delete->ch;
		if (parent == sub_root) 
			sub_root->left = to_delete->left;  //左孩子无右孩子
		else 
			parent->right = to_delete->left;  //左孩子有右孩子
	} 
	delete to_delete;
	return success;
}

主函数的实现 main

#include"Search_tree.h"
#include<iostream>
#include<string>
using namespace std;
void print(char& m)
{
	cout<<m;
}
int main()
{
	Binary_tree bt;
	string S;
	cin >> S;
	int length = S.size() - 1;
	bt.BuildTree_Postorder(bt.root,S,length);
	bt.postorder(print);
	cout<<endl;
	Search_tree st;
	char al='c';
	st.tree_search(bt.root,al);
	cout<<endl;
	al='m';
	st.remove(bt.root,al);
	bt.postorder(print);
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值