树是一种常用的数据结构,也是必须掌握的数据结构,最近准备几篇博客梳理一下自己对树的学习,也复习一下c++。
首先对于树的设计,无非就是本身数据加上左孩子右孩子两个指针。
struct node
{
int num;
node *left;
node *right;
};
有了节点,我们又要怎么建树呢?
这里笔者提供两种建树方法
第一种
node* createtree(int a[],int n)
{
static int k=0;
node *head=new node;
head->left=NULL;
head->right=NULL;
head->num=a[k++];
if(k<n) head->left=createtree(a,n);
if(k<n) head->right=createtree(a,n);
return head;
}
这种方法其实是错误的,会建出一个只有左支的单叉树,没意识到的同学要注意了。
第二种
node* createtree(int a[],int i,int n)
{
node *head=new node;
head->left=NULL;
head->right=NULL;
head->num=a[i];
if(i*2+1<n) head->left=createtree(a,i*2+1,n);
if(i*2+2<n) head->right=createtree(a,i*2+2,n);
return head;
}
看不懂上面的i*2+1的同学看这张图
接下来我们再介绍一下怎么遍历二叉树。
其实都是非常简单的递归,想起来挺难,但一看就懂
void prinfnode1(node *head)//从上到下输出
{
cout<<head->num<<endl;
if(head->left!=NULL) prinfnode1(head->left);
if(head->right!=NULL) prinfnode1(head->right);
}
void prinfnode2(node *head)//从左到右输出
{
if(head->left!=NULL) prinfnode2(head->left);
cout<<head->num<<endl;
if(head->right!=NULL) prinfnode2(head->right);
}
void prinfnode3(node *head)//从下往上输出
{
if(head->left!=NULL) prinfnode3(head->left);
if(head->right!=NULL) prinfnode3(head->right);
cout<<head->num<<endl;
}