1.二叉树创建的3种方法 在嵌套法创建二叉树的过程中,递归终止条件是十分重要设置的一环。节点数据是char类型的二叉树,嵌套创建时,很多人会用一个字符,比如输入流中的“ ”(空)来设置递归结束。倘若节点数据为int类型,则稍微复杂, 首先我们在输入时必须
在嵌套法创建二叉树的过程中,递归终止条件是十分重要设置的一环。节点数据是char类型的二叉树,嵌套创建时,很多人会用一个字符,比如输入流中的“ ”(空格)来设置递归结束。倘若节点数据为int类型,则稍微复杂,首先我们在输入时必须使用“空格,制表,换行”这3者之一间隔输入的数,且cin读取数据时候cin会跳过三种空格,因此有的人使用某个数比如“0, -1”设置递归终止,但是要求某个节点的数值就是递归终止判断条件所设置的值比如‘-1’呢,显然这不符合程序的完整性。基于此,本文提供了一种思路。
这里,我们总结了3种二叉树创建方法。约定,二叉树节点定义如下:
typedef struct BinaryTreeNode { int data; BinaryTreeNode * leftchild; BinaryTreeNode * rightchild; }Node,*NodePoint;
意图构建成的二叉树如下图所示:
Node *Create()//二叉树的创建,不带参数 { Node *root; if(cin.peek()=='#') {cin.get();return NULL;} else {root = new Node; cin>>root->data;//前序创建。 root->leftchild= Create(); root->rightchild= Create(); return root; } }可以观察到,返回为节点指针类型。
void Create(NodePoint* root)//带一个参数的二叉树创建,注意形参为指针的引用或者双重指针 { if(cin.peek()=='#') {cin.get();*root=NULL;} else {*root = new Node; cin>>(*root)->data;//前序创建 Create(&(*root)->leftchild); Create(&(*root)->rightchild); } }
总结方法一,方法二的递归终止条件。使用cin.peek()检查输入流下一个字符是否为“#”,cin.peek()只检查输入流并不抽取删掉。倘若是,结束递归,并使用cin.get()将“#”从输入流抽取并删掉。使用如下代码建立如上图所示的目标二叉树时:
NodePoint Root=NULL; Root=Create();//不带参数构建 Create(&Root);//带一个参数构建,此处形参为双重指针输入为:“35 13 0##-15#19##-7##”。当然,两种方法均需要使用前序遍历创建。‘#’控制递归截止,“ ”代表间隔int数据。这两种方法只适合前序创建。
void Create( NodePoint &root , int data ) { Node *p = new Node; p->data=data;p->leftchild=0;p->rightchild=0; if(!root) root=p; else if( p->data调用如下:data ) Create(root->leftchild,p->data ); else Create(root->rightchild,p->data ); }
while(data<20) { Create(Root,data);//此处形参为指针的引用,使用此种方法Root必须初始化 data++; }
可以观察到。第一个形参为指针引用,输入参数和赋值参数与第二种方法的形参为双重指针不同。其次,二叉树满足”降顺序二叉数装入数据,满足左 本文有参考自: 二叉树常用算法总结
2.二叉树的递归遍历
void PreTraverse(NodePoint Root)//嵌套前序遍历
{
if(Root)
{cout<
3.二叉树销毁
template
容易混淆的错误声明:void destroy(TreeNode
C++ 二叉树的实现以及指针使用注意事项