二叉树创建及基本遍历方式
2016-06-28 16:09
381 查看
定义一个二叉树结点:
创建一个二叉树:
注:
二叉树基本遍历的三种情况:
1 . 前序遍历
2 . 中序遍历
3 . 后序遍历
个人理解:遍历都是相对根结点来的,前序就是先访问根结果,中序为中间访问,后续最后访问,其他便是遵循先左后右
补充:增加宽度优先遍历【后续完善】
源码:
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;
}
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- Linux C函数参考手册(PDF版)
- 文件遍历排序函数
- C# partial关键字说明
- C#中struct和class的区别详解
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- C#用链式方法表达循环嵌套
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- C#中的委托数据类型简介
- C#编写的艺术字类实例代码
- C#实现打造气泡屏幕保护效果
- 举例讲解C#编程中委托的实例化使用
- 使用C#代码获取存储过程返回值
- Erlang中遍历取出某个位置的最大值代码
- C和指针小结(推荐)
- C++中explict关键字用法