C 数据结构之树

树的遍历方式:

前序遍历:前序遍历是先打印根节点,在打印左子树,最后打印右节点。在打印左右子树的时候,又将子树作为一个完整的数来进行打印。直到节点的子树为空。

中序遍历:中序遍历是先打印左子树,再打印根节点,最后打印右节点。在打印左右子树的时候,又将子树作为一个完整的数来进行打印。直到节点的子树为空。

后序遍历:后序遍历是先打印左子树,在打印右子树,最后打印根节点。在打印左右子树的时候,又将子树作为一个完整的数来进行打印。直到节点的子树为空。

//前序遍历

void fPrint(struct Node * node){

printf("%c   ",node->data);         // 先打印的根节点

if(node->left!=NULL){

struct Node * temp=node->left;

fPrint(temp)                           // 再打印左子树

}

if(node->right!=NULL){

struct Node * temp=node->right;

fPrint(temp);                        //再打印右子树

}

}

//中序遍历

void cPrint(struct Node * node){

if(node->left!=NULL){

struct Node * temp=node->left;

cPrint(temp);

}

printf("%c   ",node->data);

if(node->right!=NULL){

struct Node * temp=node->right;

cPrint(temp);

}

}

//后序遍历

void ePrint(struct Node * node){

if(node->left!=NULL){

struct Node * temp=node->left;

ePrint(temp);

}

if(node->right!=NULL){

struct Node * temp=node->right;

ePrint(temp);

}

printf("%c   ",node->data);

}

下面是数结构的C语言实现过程:

方法声明:

#ifndef __part_tree_h

#define __part_tree_h

#include <stdio.h>

struct Node{

char data;

struct Node * parent;

struct Node * left;

struct Node * right;

};

struct Node * newNode(char ch);

struct Node * initTree();

void fPrint(struct Node * node);

void cPrint(struct Node * node);

void ePrint(struct Node * node);

#endif /* __part_tree_h */

方法实现:

#include "2 part tree.h"

#include <stdlib.h>

struct Node * newNode(char ch){

struct Node * node=(struct Node *)malloc(sizeof(struct Node));

node->data=ch;

node->parent=NULL;

node->left=NULL;

node->right=NULL;

return node;

}

//实例化树

struct Node * initTree(){

struct Node * a=newNode(‘A‘);

struct Node * b=newNode(‘B‘);

struct Node * c=newNode(‘C‘);

struct Node * d=newNode(‘D‘);

struct Node * e=newNode(‘E‘);

struct Node * f=newNode(‘F‘);

struct Node * g=newNode(‘G‘);

a->left=b;

a->right=c;

b->left=d;

b->right=e;

b->parent=a;

c->right=f;

c->parent=a;

d->parent=b;

e->left=g;

e->parent=b;

f->parent=c;

g->parent=e;

return a;

}

//前序遍历

void fPrint(struct Node * node){

printf("%c   ",node->data);

if(node->left!=NULL){

struct Node * temp=node->left;

fPrint(temp);

}

if(node->right!=NULL){

struct Node * temp=node->right;

fPrint(temp);

}

}

//中序遍历

void cPrint(struct Node * node){

if(node->left!=NULL){

struct Node * temp=node->left;

cPrint(temp);

}

printf("%c   ",node->data);

if(node->right!=NULL){

struct Node * temp=node->right;

cPrint(temp);

}

}

//后序遍历

void ePrint(struct Node * node){

if(node->left!=NULL){

struct Node * temp=node->left;

ePrint(temp);

}

if(node->right!=NULL){

struct Node * temp=node->right;

ePrint(temp);

}

printf("%c   ",node->data);

}

主方法:

#include <stdio.h>

#include "2 part tree.h"

int main(int argc, const char * argv[]) {

struct Node * node = initTree();

printf("前序遍历: ");

fPrint(node);

printf("\n\n");

printf("中序遍历: ");

cPrint(node);

printf("\n\n");

printf("后序遍历: ");

ePrint(node);

printf("\n\n");

return 0;

}

二叉搜索树:二叉树中的每个节点都大于等于其左子树的中的任一节点,都小于等于其右子树的任意节点。

时间: 2024-09-30 15:34:43

C 数据结构之树的相关文章

数据结构-伸展树

声明:本文是对某高中生的竞赛论文学习的文章 介绍: 二叉查找树能够支持多种动态集合操作.对于一个含有n个结点的完全二叉树,这些操作的最还情况运行时间是O(lgn),但如果树是含有n个结点的线性链,则这些操作的最坏情况运行时间为O(n).而像红黑树.AVL树这种二叉查找树的变形在最坏情况下,仍能保持较好性能. 本文将要介绍的伸展树也是二叉查找树的变形,它对空间要求及编程难度的要求相对不高. 伸展树: 伸展树与二叉查找树一样,具有有序性.即伸展树的每一个结点x满足:该结点的左子树中的每个元素都小于x

javascript实现数据结构: 树和森林

树的3种常用链表结构 1 双亲表示法(顺序存储结构) 优点:parent(tree, x)操作可以在常量时间内实现 缺点:求结点的孩子时需要遍历整个结构 用一组连续的存储空间来存储树的结点,同时在每个结点中附加一个指示器(整数域) ,用以指示双亲结点的位置(下标值) . 图所示是一棵树及其双亲表示的存储结构.这种存储结构利用了任一结点的父结点唯一的性质.可以方便地直接找到任一结点的父结点,但求结点的子结点时需要扫描整个数组. 代码实现: 1 // 1.双亲表示法 2 // 优点:parent(t

javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分析算法的行为时,可用树来描述其执行过程等等. 下面讲解的内容完整代码在这:https://github.com/LukeLin/data-structure-with-js/blob/master/Binary%20tree/BinaryTree.js 首先看看树的一些概念: 1.树(Tree)是n

HDU 4902 Nice boat(数据结构-线段树)

Nice boat Problem Description There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and c

Chapter 3. 数据结构 线段树

Chapter 3. 数据结构 线段树 Sylvia's I.单点修改,区间查询. 模板: //单点修改 区间求和 //1操作 单点修改//2操作 区间求和 #include<cstdio> #include<iostream> using namespace std; #define MAXN 500005 int sum[MAXN<<2]; int n,m; void PushUp(int rt){//求和 sum[rt]=sum[rt<<1]+sum[

数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。

按先序遍历创建一棵树,以层次遍历输出 样例输入 A B # D # # C E # # F # # 样例输出 LevelOrder: A B C D E F 代码: #include <iostream> #include <queue> using namespace std; struct node { //表示一个树上的节点 char ch; node *left, *right; }; node* creat() { //以递归的方式构造一棵二叉树 node *root =

HDU 1394 Minimum Inversion Number (数据结构-线段树)

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9514    Accepted Submission(s): 5860 Problem Description The inversion number of a given number sequence a1, a2, ..., an

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

数据结构_树

树形结构 ---其实这是很简单又很难得一些东西 1 定义 树状图是一种数据结构,它是由\(n (n>=1)\)个有限节点组成一个具有层次关系的集合.把它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的. 树(tree)是包含$ n(n>0)$个结点的有穷集,其中: 1)每个元素称为结点(node) 2)有一个特定的结点被称为根结点或树根(root) 3)除根结点之外的其余数据元素被分为\(m(m≥0)\)个互不相交的集合\(T_1,T_2,\cdots

数据结构-B树

  1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree).前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率. 但是咱们有面对这样一个实际问题:就是大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的