二叉树的前序、中序、后序遍历 查找 删除
来源:互联网 发布:网络致富平台 编辑:程序博客网 时间:2024/06/07 14:56
(二叉树的删除)在本练习中,我们讨论从二叉查找树删除节点问题。删除算法不像插入算法那么简单明了。删除一个值可能有三种不同的情况————该值包含在一个叶子节点中(没有子节点),该值包含在只有一个子节点中或者包含在两个子节点的节点中。
如果该项在叶节点中,直接删除该节点,将其父节点指向它的指针置为空。
如果该项包含在只含一个子节点的节点中,把父节点的指针指向它的子节点再删除这个数据项,就是由它的子节点替代该节点的位置。最后一种情况是最难的。当要删除的节点含有2个子节点时,由另一个叶子节点代替它的位置
编写一个二叉树的成员函数deleteNode,以树的根节点指针和要删除的值为参数。该函数需要找到包含该值的节点,使用上面讨论的算法将该节点删除。该函数还要打印一条信息以表明该节点被删除。当删除完成后,使用中序、前序和后序遍历来确认该节点是否已被正确删除。
///////////////////////////////////////////////////BinSTree.h//////////////////////////////////////////////////
#pragma once
#include <iostream>
#include <stdio.h>
using namespace std;
class BinSTree;
class TreeNode
{
public:
friend class BinSTree;
TreeNode(char item, TreeNode *lptr = NULL, TreeNode *rptr = NULL ):contents(item),left(lptr),right(rptr){ }
private:
char contents; //节点值
TreeNode *left; //左孩子
TreeNode *right; //右孩子
};
typedef TreeNode* LPTreeNode;
class BinSTree
{
public:
BinSTree(void);
~BinSTree(void);
void CreatBinSTree(LPTreeNode &tree); //创建新树
void MiddleRead(TreeNode *t); //中序遍历
void FirstRead(TreeNode *t); //前序遍历
void LastRead(TreeNode *t); //后序遍历
void Find(TreeNode *tree,char i); //查找是否存在值为i的节点
LPTreeNode Search(LPTreeNode &tree); //
void DeleteNode(LPTreeNode &tree,char i); //删除值为i的节点
TreeNode *node; //根节点
private:
bool tj;
};
////////////////////////////////////////BinSTree.cpp/////////////////////////////////////////////
#include "BinSTree.h"
BinSTree::BinSTree(void)
{
tj=false;
}
BinSTree::~BinSTree(void)
{
}
void BinSTree::CreatBinSTree(LPTreeNode &tree)
{
char c;
scanf("%c",&c); //获得一个节点值
if(c==' ')
{
tree = NULL;
}
else
{
tree = new TreeNode(c); //生成一个新节点
CreatBinSTree(tree->left); //生成左子树
CreatBinSTree(tree->right); //生成右子树
}
}
void BinSTree::MiddleRead(TreeNode *t)
{
if(node == NULL)
{
cout<<"空树,无法遍历!"<<endl;
return;
}
if(t!=NULL)
{
MiddleRead(t->left);
cout<<t->contents<<" ";
MiddleRead(t->right);
}
}
void BinSTree::FirstRead(TreeNode *t)
{
if(node == NULL)
{
cout<<"空树,无法遍历!"<<endl;
return;
}
if(t!=NULL)
{
cout<<t->contents<<" ";
MiddleRead(t->left);
MiddleRead(t->right);
}
}
void BinSTree::LastRead(TreeNode *t)
{
if(node == NULL)
{
cout<<"空树,无法遍历!"<<endl;
return;
}
if(t!=NULL)
{
MiddleRead(t->left);
MiddleRead(t->right);
cout<<t->contents<<" ";
}
}
void BinSTree::Find(TreeNode *tree,char i)
{
if(tree!=NULL)
{
if(tree->contents==i)
{
tj=true;
return;
}
if(tree->left!=NULL)
{
if(tree->left->contents == i)
{
tj=true;
return;
}
}
if(tree->right!=NULL)
{
if(tree->right->contents == i)
{
tj=true;
return;
}
}
Find(tree->left,i);
Find(tree->right,i);
}
}
LPTreeNode BinSTree::Search(LPTreeNode &tree)
{
if(tree!=NULL)
{
if(tree->left->left==NULL && tree->left->right==NULL)
{
return tree->left;
}
else if(tree->right->left==NULL && tree->right->right==NULL)
{
return tree->right;
}
return Search(tree->left);
return Search(tree->right);
}
}
二叉树删除节点(二)
2008-05-01 10:13
void BinSTree::DeleteNode(LPTreeNode &tree,char i)
{
Find(tree,i);
if(!tj)
{
cout<<"无此节点!"<<endl;
return;
}
if(tree!=NULL)
{
if(node->contents == i)
{
if(node->left == NULL && node->right == NULL)
{
delete node;
node=NULL;
cout<<"已删除节点,当前树为空"<<endl;
return;
}
else if(node->left != NULL && node->right == NULL)
{
TreeNode *p = node;
TreeNode *d = new TreeNode(Search(node)->contents);
d->left = tree->left;
d->right = NULL;
node = d;
delete p;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
else if(node->right != NULL && node->left == NULL)
{
TreeNode *p = node;
TreeNode *d = new TreeNode(Search(node)->contents);
d->left = NULL;
d->right = tree->right;
node = d;
delete p;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
else
{
TreeNode *p = node;
TreeNode *d = new TreeNode(Search(node)->contents);
d->left = tree->left;
d->right = tree->right;
node = d;
delete p;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
}
if(tree->left!=NULL)
{
if(tree->left->contents == i)
{
if(tree->left->left == NULL && tree->left->right != NULL)
{
TreeNode *p = tree->left;
tree->left = tree->left->right;
delete p;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
else if(tree->left->left == NULL && tree->left->right == NULL)
{
delete tree->left;
tree->left = NULL;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
else if(tree->left->left != NULL && tree->left->right == NULL)
{
TreeNode *p = tree->left;
tree->left = tree->left->left;
delete p;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
else if(tree->left->left != NULL && tree->left->right != NULL)
{
TreeNode *p = tree->left;
TreeNode *d = new TreeNode(Search(node)->contents);
d->left = tree->left->left;
d->right = tree->left->right;
tree->left = d;
delete p;
}
return;
}
}
if(tree->right!=NULL)
{
if(tree->right->contents == i)
{
if(tree->right->left == NULL && tree->right->right == NULL)
{
delete tree->right;
tree->right = NULL;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
else if(tree->right->left != NULL && tree->right->right == NULL)
{
TreeNode *p = tree->right;
tree->right = tree->right->left;
delete p;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
else if(tree->right->left == NULL && tree->right->right != NULL)
{
TreeNode *p = tree->right;
tree->right = tree->right->right;
delete p;
cout<<"值为"<<i<<"的节点已被删除"<<endl;
}
else if(tree->right->left != NULL && tree->right->right != NULL)
{
TreeNode *p = tree->right;
TreeNode *d = new TreeNode(Search(node)->contents);
d->left = tree->right->left;
d->right = tree->right->right;
tree->right = d;
delete p;
}
return;
}
}
DeleteNode(tree->left,i);
DeleteNode(tree->right,i);
}
}
- 二叉树的前序、中序、后序遍历 查找 删除
- 二叉树构建(查找,增加,删除,前、中、后序遍历)
- 二叉排序数(创建,插入,删除,查找及前序、中序、后序遍历)
- 二叉查找树的遍历【先序(前序),中序,后序】
- 二叉搜索树的相关操作:插入节点,删除节点,排序,查找,最大值,最小值,前序,中序,后序遍历(主要用到递归的方法)
- 二叉树的前序、中序、后序遍历
- 二叉树的遍历(前序,中序,后序)
- 二叉树的遍历:前序、中序、后序
- 二叉树的前序、中序、后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序,中序,后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序,中序,后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序、中序、后序遍历
- 二叉树的前序,中序,后序遍历
- 二叉树的前序,中序,后序遍历
- 解决ThinkPad X200找不到无线网卡硬件的问题
- Servlet 3.0特性详解之可扩展性支持
- Servlet 3.0特性详解之 ServletContext 性能增强
- c++底层机制
- poj 1458 Common Subsequence
- 二叉树的前序、中序、后序遍历 查找 删除
- C++一维数组与指针
- 如何利用windosAPI计算程序运行时间 不使用VC的库,也就是说不跨系统,跨编译器
- Hibernate关系映射(1)_一对一单向外键关联
- 自己的心声
- poj 1519 Digital Roots
- 系统信息API
- boost ptime 与 time_t等的转换
- mfc 实现串口通信