二叉树的建立基本操作(链表方式)

学习数据结构,一直对二叉树不了解,对指针的调用一知半解。这二天学二叉树,搞懂了一点点,先写出代码,以后再边学习边来改进。

#include <stdlib.h>

#include <stdio.h>

typedef char DataType;

typedef struct node

{

DataType data;

struct node *lchild;

struct node *rchild;

}BinTNode,*BinTree;

void createB(BinTree &T)

{

DataType ch;

scanf("%c",&ch);

if(ch==‘.‘)

T=NULL;

else

{

T=(BinTNode *)malloc(sizeof(BinTNode));

T->data=ch;

createB(T->lchild);

createB(T->rchild);

}

}

void Inorder(BinTree &T)

{

if(T!=NULL)

{

Inorder(T->lchild);

printf("%3c",T->data);

Inorder(T->rchild);

}

}

int search(BinTree &T,DataType ch)

{/*查找结点CH,找到返回1,否则返回0*/

if(T==NULL)

return 0;

if(T->data==ch)

return 1;

return

search(T->lchild,ch);

return

search(T->rchild,ch);

}

void swapLR(BinTree &T)

{  /*交换所有结点的左右分支X*/

BinTree t;

if(T!=NULL)

{

swapLR(T->lchild);

swapLR(T->rchild);

if(T->lchild==NULL&&T->rchild)

{

T->lchild=T->rchild;

T->rchild=NULL;

}

else

if(T->lchild&&T->rchild==NULL)

{

T->rchild=T->lchild;

T->lchild=NULL;

}

else

if(T->lchild&&T->rchild)

{

t=T->lchild;

T->lchild=T->rchild;

T->rchild=t;

}

}

}

int sortBT(BinTree &T)

{/*判断是否为二叉排序树*/

if(T==NULL)

return 1;

if((T->lchild&&T->lchild->data<T->data)||(T->rchild&&T->rchild->data>T->data))

return 0;

return

sortBT(T->lchild);

return

sortBT(T->rchild);

}/*二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;*/

void countdef(BinTree T,int &n)

{  /*统计叶子结点数*/

if(T!=NULL)

{

if(T->lchild==NULL&&T->rchild==NULL)

n++;

countdef(T->lchild,n);

countdef(T->rchild,n);

}

}

void depthBT(BinTree T,int d,int *h)

{  /*求二叉树的深度*/

if(T)

{

d++;

if(d>*h)

*h=d;

depthBT(T->lchild,d,h);

depthBT(T->rchild,d,h);

}

}

void gradeBT(BinTree &T,DataType ch,int d,int *n)

{/*求ch结点所在层数*/

if (T)

{

d++;

if(T->data==ch)

*n=d;

gradeBT(T->lchild,ch,d,n);

gradeBT(T->rchild,ch,d,n);

}

}

void main()

{

DataType ch;

BinTree root,t;

int d=0,h=0,l=1,n=0;

root=(BinTNode *)malloc(sizeof(BinTNode));

printf("请按照先序遍历的顺序输入需要中序遍历的字符:\n");

createB(root);

Inorder(root);

printf("\n");

depthBT(root,d,&h);

printf("depth=%d\n",h);

gradeBT(root,‘c‘,0,&l);

printf("grade=%d\n",l);

countdef(root,n);

printf("count=%d\n",n);

printf("\n");

}

/*程序运行后的结果是:

请按照先序遍历的顺序输入需要中序遍历的字符:

abc..de.g..f...

c  b  e  g  d  f  a

depth=5

grade=3

count=3

Press any key to continue

*/

时间: 2024-10-10 06:12:37

二叉树的建立基本操作(链表方式)的相关文章

[数据结构] 二叉树的建立及其基本操作

如图: 代码: #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; char ch; typedef struct BinNode { char data; struct BinNode *lchild,*rchild; }BinNode,*BinTree; //二叉树链式存储结构 void CreateBin

数和二叉树——二叉树的建立及应用(遍历等)(基础篇)

二叉树:二叉树是每个结点最多有两个子树的有序树. 先来介绍一下二叉树的一些基本性质吧~ 二叉树的性质: 1.非空二叉树上叶子结点数等于双分支节点数加一. 性质1 二叉树第i层上的结点数目最多为2i-1(i≥1).证明:用数学归纳法证明:     归纳基础:i=1时,有2i-1=20=1.因为第1层上只有一个根结点,所以命题成立.    归纳假设:假设对所有的j(1≤j<i)命题成立,即第j层上至多有2j-1个结点,证明j=i时命题亦成立.    归纳步骤:根据归纳假设,第i-1层上至多有2i-2

12.遍历二叉树与二叉树的建立

一.遍历二叉树 1.定义 二叉树的遍历(travering binary tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次. 2.前序遍历 (1)规则:若二叉树为空,则空操作返回.否则,先访问根结点,然后前序遍历左子树,再前序遍历右子树. (2)实例 前序遍历结果为:A BDGH CEIF 分析:当最先访问根结点后,然后前序遍历左子树.当访问根的左子树时,这里"前序遍历"即我们将B假设为左子树的根来遍历. (3)算法 从二叉树定义

二叉树的二叉链表存储

1. 版本信息 (1)CentOS 6.4发行版64位,uname -a 显示如下: Linux localhost.localdomain 3.11.6 #1 SMP Sat Nov 2 23:25:40 KST 2013 x86_64 x86_64 x86_64 GNU/Linux (2)Eclipse: Version: Kepler Service Release 2 (3)Tomcat: apache-tomcat-7.0.53 (4)Mysql:      mysql-server-

二叉树的二叉链表存储结构

一.二叉树的二叉链表存储结构 二叉树的二叉链表存储结构及其操作应用广泛,各大IT公司面试的时候都很喜欢考察二叉树的奇异操作,但是万变不离其宗,只要熟练掌握二叉树的二叉链表存储结构及其基本操作,其它奇异操作根据需要进行变换即可.如下所示: typedef char TElemType; TElemType Nil = ' '; typedef struct BiTNode { TElemType data; // 结点的值 BiTNode *lchild, *rchild; // 左右孩子指针 }

二叉树的二叉链表表示和实现

二叉树的二叉链表存储结构 typedef struct BiTNode { TElemType data; BiTNode * lchild, *rchild;//左右孩子指针 }BiTNode, * BiTree; 二叉链表的22个基本操作 #define ClearBiTree DestroyBiTree//清空二叉树和销毁二叉树的操作一样 void InitBiTree(BiTree &T){ T = NULL; } void DestroyBiTree(BiTree &T){ if

C语言二叉树的建立与遍历

二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式差不多.也分好几种方式建立,这里 就写一种,就是先序建立 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct TreeNode{ 5 char ch; 6 struct TreeNode *lchild, *rch

看数据结构写代码(21) 稀疏矩阵(十字链表方式)

写完 这个样例,花费了 我不少时间.大部分时间 花费在 调试 内存问题上. 比如在销毁十字链表时.多次释放节点空间,造成 _CrtIsValidHeapPointer(pUserData) 异常. 当使用malloc 分配 一个 空间时,会将这个空间的起始地址和长度 加到一个链表中去.free(p)的时候 ,会从 链表里 查找 是否 有 这个地址空间,找到了就将这个节点从链表中删除._CrtIsValidHeapPointer(pUserData)  这个函数 正是 检查 这个空间是否 在链表里

二叉树的建立方法总结

之前已经介绍了二叉树的四种遍历(如果不熟悉请戳我),下面介绍一些二叉树的建立方式.首先需要明确的是,由于二叉树的定义是递归的,所以用递归的思想建立二叉树是很自然的想法. 1. 交互式问答方式 这种方式是最直接的方式,就是先询问用户根节点是谁,然后每次都询问用户某个节点的左孩子是谁,右孩子是谁.代码如下(其中字符'#'代表空节点): #include <cstdio> #include <cstdlib> using namespace std; typedef struct BTN