二叉树的相关操作


#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 20
typedef char TEelemtype;
typedef struct BiTNode{
TEelemtype data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//队列的方式
typedef struct queueelem
{
BiTNode* b[MAXSIZE];
int front,rear;
}Queue;

//栈的方式
//栈的结构体表示形式
typedef struct stackelem
{
BiTNode* a[MAXSIZE];
int top;
}BtStack;

BiTree CreateBiTree()
{
char ch;
scanf("%c",&ch);
getchar();
if(ch!=‘#‘){

printf("输出当前节点的值:");
printf("%c\n",ch);
BiTree tree=(BiTree)malloc(sizeof(BiTNode));
tree->data=ch;
tree->lchild=CreateBiTree();
tree->rchild=CreateBiTree();
return tree;
}else
return NULL;

}
//前序遍历二叉树
void PreOrderTraverse(BiTree T)
{

if(T)
{

printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//前序遍历非递归形式
void PreOrder(BiTree T)
{
BtStack bt;
bt.top=0;
if(T==NULL)
{
printf("此二叉树为空!");
}else
{
bt.a[bt.top++]=T;
while(bt.top>0)
{
printf("%c",bt.a[bt.top-1]->data);
BiTNode *bnode=bt.a[bt.top-1];
// printf(" 输出数值:%d",bt.top);
bt.top--;
//printf("右孩子节点的值:%c",bnode->rchild->data);
if(bnode->rchild!=NULL)
{
bt.a[bt.top]=bnode->rchild;
bt.top++;
// printf("右孩子节点的值:%c",bnode->rchild->data);

}
if(bnode->lchild!=NULL)
{
bt.a[bt.top]=bnode->lchild;
// printf("左孩子节点的值:%c",bnode->lchild->data);
bt.top++;

}

}

}

}

//中序遍历
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}

}

//中序遍历非递归的方式
void InOrder(BiTree T)
{
BtStack bt;
bt.top=0;
if(T==NULL)
{
printf("此二叉树为空!\n");

}else{
BiTNode *bnode=T;
//将首节点也放进去
bt.a[bt.top]=T;
bt.top++;
//先遍历完最左边子树的节点
while(bnode->lchild!=NULL)
{
bt.a[bt.top]=bnode->lchild;
bt.top++;
bnode=bnode->lchild;
}
//依次输出子树的节点
while(bt.top>0)
{
//输出节点
printf("%c",bt.a[bt.top-1]->data);
bnode=bt.a[bt.top-1];
bt.top--;
while(bnode->rchild!=NULL)
{
bt.a[bt.top]=bnode->rchild;
bt.top++;
bnode=bnode->rchild;
while(bnode->lchild!=NULL)
{
bt.a[bt.top]=bnode->lchild;
bt.top++;

}

}

}

}

}

//后序遍历
void PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}

}
//后序遍历非递归实现

void PostOrder(BiTree bt)
{
BtStack st;
st.top=-1;
BiTree t;
int flag;
do
{
while (bt!=NULL)
{
st.top++;
st.a[st.top]=bt;
bt=bt->lchild;
}
t=NULL;
flag=1;
while (st.top!=-1 && flag)
{
bt=st.a[st.top];
if (bt->rchild==t) //t:表示为null,或者右子节点被访问过了。
{
printf("%c",bt->data);
st.top--;
t=bt; //t记录下刚刚访问的节点
}
else
{
bt=bt->rchild;
flag=0;
}
}
} while (st.top!=-1);
}

//层序遍历
void LevelOrderTraverse(BiTree T)
{
Queue queue;
queue.front=queue.rear=0;

if(T==NULL)
{
printf("二叉树为空!\n");
}else{
queue.b[queue.rear] =T;
queue.rear=queue.rear+1;
while(queue.b[queue.front]!=NULL&&queue.rear!=queue.front)
{
printf("%c",queue.b[queue.front]->data);

//如果左孩子节点不为空,加入到队列中
if(queue.b[queue.front]->lchild!=NULL)
{

queue.rear=(queue.rear+1)%MAXSIZE;
queue.b[queue.rear]=queue.b[queue.front]->lchild;
}
if(queue.b[queue.front]->rchild!=NULL)
{

queue.rear=(queue.rear+1)%MAXSIZE;
queue.b[queue.rear]=queue.b[queue.front]->rchild;

}
queue.front=(queue.front+1)%MAXSIZE;//当前节点的队列加1

}
printf("%c",queue.b[queue.front]->data);

}

}
//获取二叉树的高度
int Height(BiTree T)
{
int dept1,dept2;
if(!T)
{
return 0;
}else{
dept1=Height(T->lchild);
dept2=Height(T->rchild);
if(dept1>dept2)
{
return dept1+1;
}else{
return dept2+1;
}
}
}

int main()
{

//创建二叉树
BiTree T=CreateBiTree();

//插入节点

//删除节点

//前序遍历
printf("前序遍历:\n");
PreOrderTraverse(T);
printf("\n");
//中序遍历
printf("中序遍历:\n");
InOrderTraverse(T);
printf("\n");

//后续遍历
printf("后序遍历:\n");
PostOrderTraverse(T);
printf("\n");

//获取二叉树的高度
printf("二叉树的高度:\n");
int hight=Height(T);
printf("%d\n",hight);

//层序遍历
printf("输出层序遍历的结果:");
LevelOrderTraverse(T);
printf("\n");

//前序遍历非递归方式
printf("按照前序非递归的方式进行遍历:");
PreOrder(T);
printf("\n");

//中序遍历非递归方式
printf("按照中序非递归的方式进行遍历:");
InOrder(T);
printf("\n");

//后序遍历非递归方式
printf("按照后序非递归的方式进行遍历:");
PostOrder(T);
printf("\n");

system("pause");
return 0;
}

二叉树的相关操作,布布扣,bubuko.com

时间: 2024-10-20 05:11:41

二叉树的相关操作的相关文章

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

二叉树及排序二叉树的相关操作汇总

前记:由于种种原因,以前一看到什么树啊链表啊,那就相当的恐惧,真是惭愧,最近仔细研究了一下这些东西,发现也就那样,或许是我之前根本就没怎么花心思学.. 话不多说,下面就直接上代码吧,也没什么好解释的,只要我自己理解代码就行了,哈哈哈... 代码参考<C和C++程序员面试秘笈>一书 // Tree.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stack> #include <queue>

java实现二叉树的相关操作

import java.util.ArrayDeque; import java.util.Queue; public class CreateTree { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Node root=new Node(); root.data=9; Node temp01=new Node(); temp01.data=1;

数据结构开发(24):二叉树中属性操作、层次遍历与典型遍历

0.目录 1.二叉树中属性操作的实现 2.二叉树结构的层次遍历 3.二叉树的典型遍历方式 4.小结 1.二叉树中属性操作的实现 二叉树的属性操作: 二叉树中结点的数目: 定义功能:count(node) 在 node 为根结点的二叉树中统计结点数目 在BTree.h中实现统计结点数目: protected: int count(BTreeNode<T>* node) const { int ret = 0; if( node != NULL ) { ret = count(node->l

(二十四)linux新定时器:timefd及相关操作函数

timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itim

linux下进程相关操作

一.定义和理解 狭义定义:进程是正在运行的程序的实例. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动. 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域.数据区域和堆栈区域.文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 第二,进程是一个“执行中的程序”.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们

android DataBase的相关操作(建立表结构和创建表)

先建立一个table的基类: public abstract class DbBaseTable { private static final String TAG = "DbBaseTable"; /** * @return the DB table name */ abstract String getName(); /** * Creates the DB table according to the DB scheme * * @param db */ abstract voi

WebView中的视频全屏的相关操作

最近工作中,基本一直在用WebView,今天就把它整理下: WebView 顾名思义,就是放一个网页,一个看起来十分简单,但是用起来不是那么简单的控件. 首先你肯定要定义,初始化一个webview,其实网上的例子很多,我这里就简单的把一些WebView 中可能会用到的的很重要的属性以及支持全屏播放视频该怎么实现的代码粘出来,直接放到项目中去就行了 <span style="white-space:pre"></span><pre name="co

jQuery学习笔记--JqGrid相关操作 方法列表(上)

1.获得当前列表行数:$("#gridid").getGridParam("reccount"); 2.获取选中行数据(json):$("#gridid").jqGrid('getRowData', id); 3.刷新列表:$(refreshSelector).jqGrid('setGridParam', { url: ''), postData: ''}).trigger('reloadGrid'); 4.选中行:$("#jqGrid