用C++&递归的方法实现二叉树的基本功能~
2018-03-16 18:46
561 查看
代码各功能的实现主要是运用递归的方法运用递归的方法特点就是代码简短且易于理解
首先是头文件的引入 引入了队列
然后是树的实现部分 用类的方法实现函数实现方法均在类内实现
//运用递归实现各项功能
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;
};
各项功能均可用不是递归的方法实现 但代码会比较长 且个人感觉逻辑上不便于理解 非递归的方法下次再贴出来最后是主函数调试部分 一切功能正常
首先是头文件的引入 引入了队列
#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); }最后附上调试结果
相关文章推荐
- C++实现二叉树前序中序后续遍历的非递归方法总结
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- C++实现二叉树的递归和非递归遍历方法
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- C++实现二叉树的基本操作(递归+非递归)
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- C++字符串拷贝实现:递归方法&非递归方法
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果