版权声明:CopyRight:Marval-C 欢迎转载 https://blog.csdn.net/gaotianyu824/article/details/82945681
由于关于二叉树的资料现在已经太多啦,那我们在这里就直接贴代码,大家对应着注释看就可以啦~~~
有一点要注意的是,二叉树这里创建时候的节点输入顺序要遵循从最左下开始逐渐向右哦~~
#include<iostream>
#include<malloc.h>
using namespace std;
typedef int data_type;
typedef struct A{
A *left;
A *right;
data_type data ;
}Node;
//新建二叉树
Node *createNode(){
Node *head;
data_type tmp;
cin>>tmp;
if(tmp == 0)
{
head = NULL;
}
else
{
//遵循从左到右、从上到下的递归赋值原则
head = (Node *) malloc(sizeof(Node));
head->data = tmp;
head->left = createNode();
head->right = createNode();
}
return head;
}
//二叉树的递归先序遍历方法
Node Previous(Node *p)
{
if(p)
{
cout<<p->data<<" ";
Previous(p->left);
Previous(p->right);
}
}
//二叉树的递归中序遍历方法
Node Middle(Node *p)
{
if(p)
{
Middle(p->left);
cout<<p->data<<" ";
Middle(p->right);
}
}
//二叉树的递归后序遍历方法
Node BackForward(Node *p)
{
if(p)
{
BackForward(p->left);
BackForward(p->right);
cout<<p->data<<" ";
}
}
//二叉树的Morris中序遍历方法
Node MorrisMiddle(Node *p)
{
//核心:通过两个指针并借助循环完成非递归的遍历
Node *p1 = p;
Node *p2 = NULL;
while(p1)
{
p2 = p1->left;
//-------------------------------------------------
if(p2)
{
while(p2->right && p2->right != p1)
{
//这里就是要将p2置于右下节点位置的意思
p2 = p2->right;
}
if(!p2->right)
{
//将p1 p2间拉成类似双向链表的结构,方便p1借助p2完成回调遍历
p2->right = p1;
p1 = p1->left;
continue;
}
}
cout<<p1->data<<" ";
p1 = p1->right;
//--------------------------------------------------
}
}
//Morris前序遍历法
Node MorrisPrevious(Node *p)
{
Node *p1 = p;
Node *p2 = NULL;
//开始根节点左侧的遍历
while(p1)
{
p2 = p1->left;
//-------------------------------------------------
if(p2)
{
while(p2->right && p2->right != p1)
{
//这里就是要将p2置于右下节点位置的意思
p2 = p2->right;
}
if(!p2->right)
{
//将p1 p2间拉成类似双向链表的结构,方便p1借助p2完成回调遍历
p2->right = p1;
cout<<p1->data<<" ";
p1 = p1->left;
continue;
}
}
else
{
cout<<p1->data<<" ";
}
p1 = p1->right;
}
}
//返回叶子节点的总数目
int LeafNumber(Node *p)
{
Node *head = p;
if(!head)
{
return 0;
}
else if(!head->left && !head->right)
return 1;
else
return (LeafNumber(head->left)+LeafNumber(head->right));
}
//返回二叉树的深度
int Deepth(Node *p)
{
Node *head = p;
if(head)
{
return Deepth(head->left)>=Deepth(head->right)?Deepth(head->left)+1:Deepth(head->right)+1;
}
else
return 0;
}
int main()
{
//创建第一个树
cout<<"Please input the binary tree: ";
Node *root = createNode();
//创建第二个树
cout<<"Please input the binary tree: ";
Node *root2 = createNode();
cout<<endl<<"先序递归遍历结果为:";
Previous(root);
cout<<endl<<"中序递归遍历结果为:";
Middle(root);
cout<<endl<<"后序递归遍历结果为: ";
BackForward(root);
cout<<endl<<"Tree1的叶子节点数目为: "<<LeafNumber(root);
cout<<endl<<"Tree2的叶子节点数目为:"<<LeafNumber(root2);
cout<<endl<<"Tree1的深度为: "<<Deepth(root);
cout<<endl<<"Tree2的深度为:"<<Deepth(root2);
cout<<endl<<endl<<"Morris中序遍历的结果为: ";
MorrisMiddle(root);
cout<<endl<<"Morris先序遍历的结果为: ";
MorrisPrevious(root2);
}
上文中没有做的是Morris遍历的后序法,由于这个方法对新手而言很不友好,在这里我们秉着实用的原则,就先不与赘述啦。
感兴趣的话欢迎自行去学习哦~~~
在这里我们给出大家一组测试数据和对应结果——>