二叉树问题——7-4 数据结构考题 二叉树的遍历-先序(25 分)

237 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

题目描述:

以二叉链表作存储结构,建立一棵二叉树, 输出该二叉树的先序遍历序列。

二叉链表的类型描述:

typedef char ElemType;
typedef  struct  BiNode
{  ElemType  data;
    struct  BiNode   *lchild,*rchild;
}BiNode,*BiTree;  

输入格式:

输入一个二叉树的先序序列,孩子为空的位置以#替代。

输出格式:

输出该二叉树的先序遍历序列。输出的遍历序列中字符间均无间隔。
具体格式参看输出样例。

对于下图中给出的二叉树:

二叉树

输入样例:

ABD##FE###CG#H##I##

输出样例:

ABDFECGHI

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB


创建二叉树

二叉树的创建过程是一个递归的过程,递归一般都是这样的格式:

if(递归借书条件)
else(接下来的操作)

那么在创建二叉树是怎么样的呢?

首先if里面是temp不等于'#',对吧
那么当temp不等于#时,我们直接创建一个新的结构体,然后先序的递归创建树

先序遍历:

二叉树无非是递归的具体体现,我们直接if判断结束条件,如果根节点为空,直接结束递归,否则这就cout一下,再接着递归其左右子树

思路具体化:

1.创建二叉树结点的结构体

2.按照我在之前写得方法写一个创建二叉树的函数(注意要用二级指针)

3.既然是要输出先序遍历的结果,当然要写先序遍历的函数啦

4.最后就是超简洁的main函数

代码如下:

#include<iostream>
using namespace std;

//定义结构体
struct BTNode
{
	char c;
	BTNode* lchild;
	BTNode* rchild;
	BTNode() {
		c = '\0';
		lchild = NULL;
		rchild = NULL;
	}
	BTNode(char x) {
		c = x;
		lchild = NULL;
		rchild = NULL;
	}
};

BTNode* T;

//创建二叉树
void CreatBTtree(BTNode*& root) {
	char temp;
	cin >> temp;
	if (temp != '#') {
		root = new BTNode(temp);
		CreatBTtree(root->lchild);
		CreatBTtree(root->rchild);
	}
}

//先序遍历
void PreOrder(BTNode* root) {
	if (root == NULL)
		return;
	cout << root->c;
	PreOrder(root->lchild);
	PreOrder(root->rchild);
}

//超简洁的main函数
int main()
{
	CreatBTtree(T);
	PreOrder(T);
	return 0;
}

PS:成功解题=理清思路+一定的技巧~