哈喽。之前还没有写二叉树的时候,我的思维很简单,就是一棵树。
对于一颗二叉树,先写两个类,一个Node结点,一个tree类(里面包括树根和树高)。我是小白,所以想的很少,一开始我以为我可以层次遍历输入,但是我没有弄好一个问题,就是树的数据结构比较复杂。
比如我们看这一棵树,如果用递归的方法去创建一棵树,也就是
BiNode* create(int s[],int &pos,int size)//构造一棵二叉树
{
{
root->lchild=create(s,pos,size);
root->rchild=create(s,pos,size);}
return root;
}
这样去创建一棵树的话,那么按照这个思路走下去,④号结点是处于③号结点之下的,我们无法将④号放到②号下,所以层次遍历是行不通的,我们只能用简单的先序输入,加一些判断条件,建立这样的一棵二叉树。
网上的有些代码都是这样的输入,我一开始也没有懂,后来才慢慢懂得,如果想实现普通的树的创建,我还在写代码中,应该是用队列的方法实现。
这样一个简单的先序输出的话,我们可以设置一棵树,把叶子节点的左右孩子都设为0(或者其他的判断条件)。若检查到0,则返回其叶子的父亲结点,再继续先序遍历,这样一颗树就可以创建了。createTree的部分结束,那么接下来的先序遍历就很简单,就是一个递归的过程。
贴下我的代码。
#include<iostream>
#include <string>
using namespace std;
class BiNode
{
public:
int data;
BiNode *lchild;
BiNode *rchild;
};
class BiTree
{ public:
BiNode *root;
int height;
void create(string &s,int &pos);//创建一棵树
void preOrder(BiNode *T);//先序遍历二叉树
};
//先序创建一棵二叉树,需要先序遍历
BiNode* create(int s[],int &pos,int size)//构造一棵二叉树
{ pos++;
BiNode *root=NULL;
if((pos<size)&&s[pos]!=0)//如果在数组范围内,且值合法
{
root=new BiNode;
root->data=s[pos];
root->lchild=create(s,pos,size);
root->rchild=create(s,pos,size);}
return root;
}
//层次输入一棵二叉树
//BiNode * create (int s[],int size)//用队列的数据结构
void _PreOrder(BiNode *_root)
{ BiNode *tmp=_root;
if(tmp!=NULL){
cout<<tmp->data;//访问根节点
_PreOrder(tmp->lchild);//递归遍历左子树
_PreOrder(tmp->rchild);//递归遍历右子树
}
}
int main()
{ int a[]={1,2,3,0,0,4,0,0,5,6,0,0,0};
int pos;
int size;
size=13;
pos=-1;
BiNode *root=create(a,pos,size);
//BiNode *root;
// root=create(a,pos,size);
_PreOrder(root);
return 0;
}
这种方法的输入很有讲究,这不是一个通用的方法,一般机试估计这方法不行,下一篇我会详细叙述如何层次遍历一棵二叉树,并实现输出。结果就是这样输出的。
下篇再见啦~