您的位置:首页 > 其它

二叉树创建及基本遍历方式

2016-06-28 16:09 381 查看
定义一个二叉树结点:

typedef struct TreeNode {
char data;
struct TreeNode *left_Child, *right_Child;
}TreeNode,*Tree; // TreeNode为类型,Tree为对象


创建一个二叉树:

Tree createTree() {
char ch;
Tree T;
ch = getchar();
if (ch == '#') { // 输入#代表没有相应的子节点,必须要输入不然无法表示结果怎样
T = NULL;
}
else {
T = (Tree)malloc(sizeof(TreeNode));
T->data = ch;
T->left_Child = createTree();
T->right_Child = createTree();
}
return T;
}


注:

//输入格式有要求

能构成一个二叉树,一定要表明,空的叶子,不然是无法进行解析出来的,而且当前的输入为前序遍历,从根到左再到右节点

如abd##e##cf##g##

a
b       c
d    e   f   g
# #  # # # # # #    这一级为空,但必须用#表示出来


二叉树基本遍历的三种情况:

1 . 前序遍历

先访问根结点,再访问左子结点,最后再访问右子结点


// 先序遍历二叉树
void preOrderTraverse(Tree T) {
if (T) {
printf(" %c",T->data);
preOrderTraverse(T->left_Child);
preOrderTraverse(T->right_Child);
}
}


2 . 中序遍历

先访问左子结点,再访问根结点,最后访问右子结点


// 中序遍历
void inOrderTraverse(Tree T) {
if (T) {
inOrderTraverse(T->left_Child);
printf(" %c",T->data);
inOrderTraverse(T->right_Child);
}
}


3 . 后序遍历

先访问左子结点,再访问右子结点,最后访问根结点


// 后续遍历
void posetOrderTraverse(Tree T) {
if (T) {
posetOrderTraverse(T->left_Child);
posetOrderTraverse(T->right_Child);
printf(" %c",T->data);
}
}


个人理解:遍历都是相对根结点来的,前序就是先访问根结果,中序为中间访问,后续最后访问,其他便是遵循先左后右

补充:增加宽度优先遍历【后续完善】

宽度优先遍历:先访问树的第一层结点,再访问树的第二层结点。。。一直到最下面一层,在同一层中,以从左到右的顺序依次访问  ,思路参照下面代码


源码:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode { char data; struct TreeNode *left_Child, *right_Child; }TreeNode,*Tree; // TreeNode为类型,Tree为对象

Tree createTree() { char ch; Tree T; ch = getchar(); if (ch == '#') { // 输入#代表没有相应的子节点,必须要输入不然无法表示结果怎样 T = NULL; } else { T = (Tree)malloc(sizeof(TreeNode)); T->data = ch; T->left_Child = createTree(); T->right_Child = createTree(); } return T; }

// 先序遍历二叉树 void preOrderTraverse(Tree T) { if (T) { printf(" %c",T->data); preOrderTraverse(T->left_Child); preOrderTraverse(T->right_Child); } }
// 中序遍历 void inOrderTraverse(Tree T) { if (T) { inOrderTraverse(T->left_Child); printf(" %c",T->data); inOrderTraverse(T->right_Child); } }

// 后续遍历 void posetOrderTraverse(Tree T) { if (T) { posetOrderTraverse(T->left_Child); posetOrderTraverse(T->right_Child); printf(" %c",T->data); } }

/* 宽度优先遍历思路:需要用到一个队列来存储每次遍历到的左右节点,并按照顺序来取值,将值放到队列中,
然后从队列中打印最前面的值,并根据最前的指针找出其所拥有的两个子结点,并将子结点放到队列的后面
*/
void lengthTraverse(Tree T) {
if (T) {
}
}

int main(int argc, const char * argv[]) {
// insert code here...
// printf("Hello, World!\n");
Tree T;
T = createTree(); // 建立
printf("前序遍历:");
preOrderTraverse(T);//输出
printf("\n");

printf("中序遍历:");
inOrderTraverse(T);
printf("\n");

printf("后序遍历:");
posetOrderTraverse(T);
printf("\n");

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历 struct C