您的位置:首页 > 编程语言 > C语言/C++

用C++&递归的方法实现二叉树的基本功能~

2018-03-16 18:46 561 查看
代码各功能的实现主要是运用递归的方法运用递归的方法特点就是代码简短且易于理解

首先是头文件的引入 引入了队列
#include<iostream>
#include<queue>
using namespace std;


然后是树的实现部分 用类的方法实现函数实现方法均在类内实现
//运用递归实现各项功能
class Node //节点
{
public:
Node(char c):m_value(c),m_left(NULL),m_right(NULL){}
char m_value;
Node *m_left;
Node *m_right;
};
class Tree //树
{
public:
Tree(int flag):m_root(NULL),m_flag(flag){}
Node* Create(char *&str)//用给出的字符串递归创造二叉树
{
if(*str == m_flag)
return NULL;
else
{
Node *p = new Node(*str);
p->m_left = Create(++str);
p->m_right = Create(++str);
return p;
}
}
void PreOrder(Node *root)//前序遍历
{
if(root != NULL)
{
cout<<root->m_value<<" ";
PreOrder(root->m_left);
PreOrder(root->m_right);
}
}
void InOrder(Node *root)//中序遍历
{
if(root != NULL)
{
InOrder(root->m_left);
cout<<root->m_value<<" ";
InOrder(root->m_right);
}
}
void PostOrder(Node *root)//后序遍历
{
if(root != NULL)
{
PostOrder(root->m_left);
PostOrder(root->m_right);
cout<<root->m_value<<" ";
}
}
int Size(Node *root)//求节点个数
{
if(root == NULL)
return 0;
else
return Size(root->m_left) + Size(root->m_right)+1;
}
int Height(Node *root)//求树的深度
{
if(root == NULL)
return 0;
else
{
int m1 = Height(root->m_left);
int m2 = Height(root->m_right);
return m1 > m2 ? (m1+1) : (m2+1);
}
}
Node *Search(Node *root,char k)//按字符查找树的节点并返回
{
if(root == NULL)
return NULL;
if(root->m_value == k)
return root;
Node *p = Search(root->m_left,k);
if(p != NULL)
return p;
return Search(root->m_right,k);
}
Node *Parent(Node *root,char k)//查找该节点的父节点并返回
{
if(root == NULL || root->m_value == k)
return NULL;

if((root->m_left != NULL && root->m_left->m_value == k )||(root->m_right !=NULL && root->m_right->m_value == k))
return root;
Node *p = Parent(root->m_left,k);
if(p != NULL)
return p;
return Parent(root->m_right,k);
}
void Cengci(Node *root)//层次遍历 非递归方法 引入队列
{
if(root == NULL)
return;
queue<Node*> q;
Node *temp;
q.push(root);
while(!q.empty())
{
temp = q.front();
q.pop();
cout<<temp->m_value<<" ";
if(temp->m_lef
4000
t != NULL)
q.push(temp->m_left);
if(temp->m_right != NULL)
q.push(temp->m_right);
}
cout<<endl;
}
Node *m_root;
int m_flag;
};
各项功能均可用不是递归的方法实现 但代码会比较长 且个人感觉逻辑上不便于理解 非递归的方法下次再贴出来最后是主函数调试部分 一切功能正常
void main()
{
Tree t('#');
char *str = "abdg##hi####ce#j##f##";
t.m_root = t.Create(str);
t.PreOrder(t.m_root);
cout<<endl;
t.InOrder(t.m_root);
cout<<endl;
t.PostOrder(t.m_root);
cout<<endl;
cout<<"size = "<<t.Size(t.m_root)<<endl;
cout<<"height = "<<t.Height(t.m_root)<<endl;
Node *f = t.Search(t.m_root,'c');
if(f != NULL)
cout<<f<<" "<<f->m_value<<endl;
Node *p = t.Parent(t.m_root,'g');
if(p != NULL)
cout<<p<<" "<<p->m_value<<endl;
t.Cengci(t.m_root);
}
最后附上调试结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐