二叉树学习笔记之利用前序遍历递归创建二叉树

利用前序遍历创建二叉树

  • 树的遍历
  • 前序遍历(preorder traversal)
  • 利用前序遍历创建二叉树
  • 中序遍历访问所有结点
  • 前序遍历访问所有结点
  • 后序遍历访问所有结点
  • 实例

树的遍历

树的遍历是指从根结点出发,按照某种次序访问树中的所有结点,使得每个结点被访问一次且仅被访问一次。

前序遍历(preorder traversal)

若树为空,则空操作返回;否则
1.访问根结点
2.按照从左到右的顺序前序遍历根结点的每一棵子树。
二叉树的前序遍历
若树为空,则空操作返回;否则
1.访问根结点
2.前序遍历根结点的左子树
2.前序遍历根结点的右子树
前序遍历是指按照先根结点,再左结点,最后右结点的次序访问二叉树中所有的结点,使得每个结点被访问且仅被访问一次。

利用前序遍历创建二叉树

利用二叉链表表示法(即树的孩子兄弟表示法)定义树的结点数据结构

template
struct TNode
{
	DataType data; //树结点元素
	TNode* left;  //左子树指针
	TNode* right; //右子树指针
}

data为数据域,存放该结点的数据信息;
left为左指针域,存放该结点左孩子的指针,当左孩子不存在时为空指针;
right为右指针域,存放该结点右孩子的指针,当右孩子不存在时为空指针。

BiTreeNode* CreatBiTree(char* s, int &i, int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
    BiTreeNode* root;
    char item = s[i++];
    if(i>=len || item=='#')//当字符串下标上溢或者对应的位置为空时,将结点指针指向空
    {
        root=NULL;
    }
    else
    {
        root = new BiTreeNode(item);
        root->left = CreatBiTree(s, i, len);
        root->right = CreatBiTree(s, i, len);
    }
    return root;
}

或者

BiTreeNode* CreatBiTree(char* s,int &i,int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
    BiTreeNode* root;
    if(s[i]=='#'||len==0||i==len){
        return NULL;
    }
    else{
        root = new BiTreeNode(s[i++]);
        root->left = CreatBiTree(s,i,len);
        root->right = CreatBiTree(s,++i,len);
    }
    return root;
}

中序遍历访问所有结点

void InOrder(BiTreeNode* root)
// 二叉树的中序遍历
// 参数:二叉树根结点root
{
    if(root){       //如果root !=NULL的话执行后续操作
        InOrder(root->left);
        printf("%c",root->data);
        InOrder(root->right);
    }
}

前序遍历访问所有结点

void PreOrder(BitreeNode* root)
//二叉树的前序遍历
//参数:二叉树根结点root
{
	if(root)
	{
		printf("%c",root->data);
		PreOrder(root->left);
		PreOrder(root->right);
	}

后序遍历访问所有结点

void PostOrder(BitreeNode* root)
//二叉树的后序遍历
//参数:二叉树根结点root
{
	if(root)
	{
		PreOrder(root->left);
		PreOrder(root->right);
		printf("%c",root->data);
	}

实例

#include 
#include           //注
#include 
#include       //注

using namespace std;

struct BiTreeNode {
    char data;              //  树结点元素
    BiTreeNode* left;       //  左子树指针
    BiTreeNode* right;      //  右子树指针
    BiTreeNode(){           //  树结点初始化
        left=NULL;
        right=NULL;
    }
    BiTreeNode(char item){  //  用元素初始化树结点
        data=item;
        left=NULL;
        right=NULL;
    }
    ~BiTreeNode(){          //  释放树结点内存
        left=NULL;
        right=NULL;
    }
};
BiTreeNode* CreatBiTree(char* s, int &i, int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
    BiTreeNode* root;
    char item = s[i++];
    if(i>=len || item=='#')
    {
        root=NULL;
    }
    else
    {
        root = new BiTreeNode(item);
        root->left = CreatBiTree(s, i, len);
        root->right = CreatBiTree(s, i, len);
    }
    return root;
}
/*
BiTreeNode* CreatBiTree(char* s,int &i,int len)
// 利用先序遍历创建二叉树
// 参数:先序遍历字符串s,字符串初始下标i=0,字符串长度len。
// 返回:二叉树
{
    BiTreeNode* root;
    if(s[i]=='#'||len==0||i==len){
        return NULL;
    }
    else{
        root = new BiTreeNode(s[i++]);
        root->left = CreatBiTree(s,i,len);
        root->right = CreatBiTree(s,++i,len);
    }
    return root;
}
*/
void InOrder(BiTreeNode* root)
// 二叉树的中序遍历
// 参数:二叉树根结点root
// 输出:中间没有空格,末尾不换行。
{
    if(root){
        InOrder(root->left);
        printf("%c",root->data);
        InOrder(root->right);
    }
}

int main(int argc, const char * argv[]) {
    char str[200];
    scanf("%s", str);

    int i = 0;
    int len = int(strlen(str));
    BiTreeNode* root = CreatBiTree(str, i, len);

    InOrder(root);

    return 0;
}

测试文件:
测试输入:ABC##D##EF###
预期输出:CBDAFE

测试输入:ABCD###E#F##G##
预期输出:DCBEFAG

注:
1.#include< cstdio>
cstdio是将stdio.h的内容用C++头文件的形式表示出来。stdio.h是C标准函数库中的头文件,即:standard buffered input&output。提供基本的文字的输入输出流操作(包括屏幕和文件等)。由于C语言并没有提供专用于文字输入输出的关键字,所以该库是最普遍的C语言程序加载库。
使用方法
stdio.h是以往的C和C++的头文件,cstdio是标准C++(STL),且cstdio中的函数都是定义在一个名称空间std里面的,如果要调用这个名字空间的函数,必须得加std::或者在文件中声明using namespace std。

#include
 
using namespace std;/*你也可以同时加上这个语句*/

2.#include< algorithm>
algorithm意为"算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数。

参考:https://www.educoder.net/ 中的数据结构实验题

你可能感兴趣的:(二叉树的学习笔记)