当前位置:首页 » 操作系统 » 二叉树源码

二叉树源码

发布时间: 2022-08-26 13:13:33

Ⅰ 数据结构,求二叉树递归和非递归的先序、中序、后序遍历和线索化二叉树的先序、中序、后序遍历的源代码。

给你个递归的吧
/*
2013年3月21日 17:37:19
目的:实现"静态"链式二叉表的操作(此处的静态是指已知二叉树的结构)
*/
#include <stdio.h>
#include <malloc.h>

typedef struct TreeNode
{
int Data;
struct TreeNode * pLchild;
struct TreeNode * pRchild;
}TN, *pTN;

pTN CreatTree(void);
void PreTraverse(pTN);/*先序编历*/
void InTraverse(pTN);/*中序遍历*/
void PostTraverse(pTN);/*后序遍历*/
int main(void)
{
pTN Root;

Root = CreatTree();
PreTraverse(Root);
puts("\n");
InTraverse(Root);
puts("\n");
PostTraverse(Root);
puts("\n");
return 0;
}

pTN CreatTree(void)
{
pTN A = (pTN)malloc(sizeof(TN));
pTN B = (pTN)malloc(sizeof(TN));
pTN C = (pTN)malloc(sizeof(TN));
pTN D = (pTN)malloc(sizeof(TN));
pTN E = (pTN)malloc(sizeof(TN));
pTN F = (pTN)malloc(sizeof(TN));

A->Data = 'A';
B->Data = 'B';
C->Data = 'C';
D->Data = 'D';
E->Data = 'E';
F->Data = 'F';

A->pLchild = B;
B->pLchild = D;
B->pRchild = E;
D->pLchild = D->pRchild = NULL;
E->pLchild = E->pRchild = NULL;
A->pRchild = C;
C->pLchild = NULL;
C->pRchild = F;
F->pLchild = F->pRchild = NULL;

return A;
}
void PreTraverse(pTN Root)
{
if (NULL != Root)
{
printf("%c ", Root->Data);
}
if (NULL != Root->pLchild)
{
PreTraverse(Root->pLchild);
}
if (NULL != Root->pRchild)
{
PreTraverse(Root->pRchild);
}
return;
}
void InTraverse(pTN Root)
{
if (NULL != Root->pLchild)
{
InTraverse(Root->pLchild);
}
printf("%c ", Root->Data);
if (NULL != Root)
{

}
if (NULL != Root->pRchild)
{
InTraverse(Root->pRchild);
}
return;
}
void PostTraverse(pTN Root)
{
if (NULL != Root->pLchild)
{
PostTraverse(Root->pLchild);
}

if (NULL != Root->pRchild)
{
PostTraverse(Root->pRchild);
}
printf("%c ", Root->Data);
if (NULL != Root)
{}
return;
}

java二叉树求源码,一个小作业= =

终止搞定,inorder和postorder分别是中序和后序
public class Test
{
static String inorder = "287413695";//"BDEFACHG"; //已知中序
static String postorder = "874296531";//"FEDBHGCA"; //已知后序
static Node root;

static class Node
{
public Node(char divideChar)
{
this.data = divideChar;
}

Node left;
Node right;
char data;
}

static Node divide(String in,String post,Node node)
{
if (in == null || in.length() < 1 || post == null || post.length() < 1)
return null;

String left = "";
char divideChar = post.charAt(post.length()-1);

if(in.indexOf(divideChar) != -1)
left = in.substring(0, in.indexOf(divideChar));

String right = in.substring(in.indexOf(divideChar) + 1);

if(node == null)
root = node = new Node(divideChar);
else
node = new Node(divideChar);

if (left != null)
{
if(left.length() > 1)
node.left = divide(left, post.substring(0,left.length()),node);
else if(left.length() == 1)
node.left = new Node(left.charAt(0));
}

if (right != null)
{
if(right.length() > 1)
node.right = divide(right, post.substring(left.length(),post.length()-1),node);
else if(right.length() == 1)
node.right = new Node(right.charAt(0));
}
return node;
}

static void preorder(Node node)
{
if(node == null) return;
System.out.println(node.data);

if(node.left != null) preorder(node.left);
if(node.right != null) preorder(node.right);
}

public static void main(String[] args)
{
root = divide(inorder, postorder,root);
preorder(root); //打印前序
}
}

Ⅲ 用c语言写二叉树,源代码。

//定义结构体
typedef
struct
btnode
{
char
data;
struct
btnode
*lchild,*rchild;
}*bitreptr;
//建立二叉树
void
create_btr(bitreptr
t)
{
getchar();
if(x=='#')
t=NULL;
else
{
p=new
node;
p->data=x;
t=p;
create_btr(t->lchild);
create_btr(t->rchild);
}
}
//中序遍历二叉树
void
inorder(bitreptr
p)
{
if(p)
{
inorder(p->lchild);//访问左子树
printf("%c",p->data);//访问根节点
inorder(p->rchild);//访问右子树
}
}
其他的细节你自己去完善,我就写到这里了

Ⅳ 二叉树遍历 求C或C++的源代码

#include<iostream>
usingstd::cin;
usingstd::cout;
usingstd::endl;

structnode
{
intdata;
node*lchild;
node*rchild;
};

classbinarytree
{
private:
node*head;//rootofbinarytree
protected:
voidcreat(node*&p);//creattree
voiddestroy(node*p);
void_pretraverse(constnode*p);
void_inordertraverse(constnode*p);
void_posttraverse(constnode*p);
public:
binarytree();
voidpretraverse();
voidinordertraverse();
voidposttraverse();
~binarytree();
};

binarytree::binarytree()
{
creat(head);
}

voidbinarytree::destroy(node*p)
{
if(p)
{
destroy(p->lchild);
destroy(p->rchild);
deletep;
}
}

voidbinarytree::_pretraverse(constnode*p)
{
if(p)
{
cout<<p->data<<"";
_pretraverse(p->lchild);
_pretraverse(p->rchild);
}
}

voidbinarytree::_inordertraverse(constnode*p)
{
if(p)
{
_inordertraverse(p->lchild);
cout<<p->data<<"";
_inordertraverse(p->rchild);
}
}

voidbinarytree::_posttraverse(constnode*p)
{
if(p)
{
_posttraverse(p->lchild);
_posttraverse(p->rchild);
cout<<p->data<<"";
}
}

voidbinarytree::creat(node*&p)
{
intn=0;
cin>>n;
if(!n)
{
p=NULL;
}
else
{
p=newnode;
p->data=n;
creat(p->lchild);
creat(p->rchild);
}
}

voidbinarytree::pretraverse()
{
cout<<"preordertraversal: ";
_pretraverse(head);
cout<<" ";
}

voidbinarytree::inordertraverse()
{
cout<<"inordertraversal: ";
_inordertraverse(head);
cout<<" ";
}

voidbinarytree::posttraverse()
{
cout<<"postordertraversal: ";
_posttraverse(head);
cout<<" ";
}

binarytree::~binarytree()
{
destroy(head);
}

intmain()
{
binarytreeb1;
b1.pretraverse();
b1.inordertraverse();
b1.posttraverse();
return0;
}
如有问题,可继续追问

Ⅳ 用队列实现按层次创建二叉树的源代码,最好是C语言

队列??你每输入一个节点将其存入队列中,再输入它的左孩子,它的左孩子也会入队,我们取的时候应先取该节点的左孩子,

LZ一定要用队列也行,但绝对不是正确的选择!

队列如下:

#include <iostream>
using namespace std;
typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}*bitree,tree;
int number=0;
void createbitree(bitree &t)
{
char c;
int i=0,r=0,f=0;//r,f分别指向队首和队尾
bitree p=NULL,temp=NULL,pre=NULL,s[100];
s[0]=NULL;
int lflag[100]={0};
int rflag[100]={0};
printf("请输入根节点:");
t=new tree;
t->lchild=t->rchild=NULL;
scanf("%c",&t->data);
temp=pre=t->lchild;
s[++i]=t;
f=i;
p = t;
while(f!=r)
{
if(p->lchild==NULL&&lflag[i]==0)
{
printf("请输入%c的左孩子:",p->data);
fflush(stdin);
scanf("%c",&c);
if(c!='#')
{
p->lchild = new tree;
p = p->lchild;
p->lchild=p->rchild=NULL;
p->data = c;
s[++f]=p;
i = f;
lflag[i]=rflag[i]=0;
}
else
lflag[i]=1;
}
else if(p->rchild==NULL&&rflag[i]==0)
{
printf("请输入%c的右孩子:",p->data);
fflush(stdin);
scanf("%c",&c);
if(c!='#')
{
p->rchild = new tree;
p = p->rchild;
p->lchild=p->rchild=NULL;
p->data = c;
s[++f]=p;
i=f;
lflag[i]=rflag[i]=0;
}
else
{
rflag[i]=1;
p=s[++r];
i=r;
}
}
else
{
p=s[++r];
i=r;
}
}
}
void preorder(bitree &t)//遍历二叉树,输出函数
{
if (t!=0)
{
cout<<t->data<<",";
preorder(t->lchild);
preorder(t->rchild);
}
}
void main()
{
bitree t;
t=0;
createbitree(t);
cout<<"the value of the preorder value is:";
preorder(t);
}

在此,强烈建议LZ用栈,更符合树的输入层次:

#include <iostream>
using namespace std;
typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}*bitree,tree;
int number=0;
void createbitree(bitree &t)
{
char c;
int i=0;
bitree p=NULL,temp=NULL,pre=NULL,s[100];
s[0]=NULL;
int lflag[100]={0};
int rflag[100]={0};
printf("请输入根节点:");
t=new tree;
t->lchild=t->rchild=NULL;
scanf("%c",&t->data);
temp=pre=t->lchild;
s[++i]=t;
p = t;
while(s[i]!=NULL)
{
if(p->lchild==NULL&&lflag[i]==0)
{
printf("请输入%c的左孩子:",p->data);
fflush(stdin);
scanf("%c",&c);
if(c!='#')
{
p->lchild = new tree;
p = p->lchild;
p->lchild=p->rchild=NULL;
p->data = c;
s[++i]=p;
lflag[i]=rflag[i]=0;
}
else
lflag[i]=1;
}
else if(p->rchild==NULL&&rflag[i]==0)
{
printf("请输入%c的右孩子:",p->data);
fflush(stdin);
scanf("%c",&c);
if(c!='#')
{
p->rchild = new tree;
p = p->rchild;
p->lchild=p->rchild=NULL;
p->data = c;
s[++i]=p;
lflag[i]=rflag[i]=0;
}
else
{
rflag[i]=1;
p=s[--i];
}
}
else
p=s[--i];
}
}
void preorder(bitree &t)//遍历二叉树,输出函数
{
if (t!=0)
{
cout<<t->data<<",";
preorder(t->lchild);
preorder(t->rchild);
}
}
void main()
{
bitree t;
t=0;
createbitree(t);
cout<<"the value of the preorder value is:";
preorder(t);
}

不懂追问!你的疑问往往是我要学习的地方!

Ⅵ 说明生活中遇到的二叉树,用java实现二叉树. (求源码,要求简练、易懂。非常满意会额外加分)

import java.util.ArrayList;

// 树的一个节点
class TreeNode {

Object _value = null; // 他的值
TreeNode _parent = null; // 他的父节点,根节点没有PARENT
ArrayList _childList = new ArrayList(); // 他的孩子节点

public TreeNode( Object value, TreeNode parent ){
this._parent = parent;
this._value = value;
}

public TreeNode getParent(){
return _parent;
}

public String toString() {
return _value.toString();
}
}

public class Tree {

// 给出宽度优先遍历的值数组,构建出一棵多叉树
// null 值表示一个层次的结束
// "|" 表示一个层次中一个父亲节点的孩子输入结束
// 如:给定下面的值数组:
// { "root", null, "left", "right", null }
// 则构建出一个根节点,带有两个孩子("left","right")的树
public Tree( Object[] values ){
// 创建根
_root = new TreeNode( values[0], null );

// 创建下面的子节点
TreeNode currentParent = _root; // 用于待创建节点的父亲
//TreeNode nextParent = null;
int currentChildIndex = 0; // 表示 currentParent 是他的父亲的第几个儿子
//TreeNode lastNode = null; // 最后一个创建出来的TreeNode,用于找到他的父亲
for ( int i = 2; i < values.length; i++ ){

// 如果null ,表示下一个节点的父亲是当前节点的父亲的第一个孩子节点
if ( values[i] == null ){
currentParent = (TreeNode)currentParent._childList.get(0);
currentChildIndex = 0;
continue;
}

// 表示一个父节点的所有孩子输入完毕
if ( values[i].equals("|") ){
if ( currentChildIndex+1 < currentParent._childList.size() ){
currentChildIndex++;
currentParent = (TreeNode)currentParent._parent._childList.get(currentChildIndex);
}
continue;
}

TreeNode child = createChildNode( currentParent, values[i] );
}
}

TreeNode _root = null;

public TreeNode getRoot(){
return _root;
}
/**
// 按宽度优先遍历,打印出parent子树所有的节点
private void printSteps( TreeNode parent, int currentDepth ){
for ( int i = 0; i < parent._childList.size(); i++ ){
TreeNode child = (TreeNode)parent._childList.get(i);
System.out.println(currentDepth+":"+child);
}
if ( parent._childList.size() != 0 ) System.out.println(""+null);// 为了避免叶子节点也会打印null

//打印 parent 同层的节点的孩子
if ( parent._parent != null ){ // 不是root
int i = 1;
while ( i < parent._parent._childList.size() ){// parent 的父亲还有孩子
TreeNode current = (TreeNode)parent._parent._childList.get(i);
printSteps( current, currentDepth );
i++;
}
}

// 递归调用,打印所有节点
for ( int i = 0; i < parent._childList.size(); i++ ){
TreeNode child = (TreeNode)parent._childList.get(i);
printSteps( child, currentDepth+1 );
}

}

// 按宽度优先遍历,打印出parent子树所有的节点
public void printSteps(){
System.out.println(""+_root);
System.out.println(""+null);

printSteps(_root, 1 );
}**/

// 将给定的值做为 parent 的孩子,构建节点
private TreeNode createChildNode( TreeNode parent, Object value ){
TreeNode child = new TreeNode( value , parent );
parent._childList.add( child );
return child;
}

public static void main(String[] args) {

Tree tree = new Tree( new Object[]{ "root", null,
"left", "right", null,
"l1","l2","l3", "|", "r1","r2",null } );
//tree.printSteps();

System.out.println(""+ ( (TreeNode)tree.getRoot()._childList.get(0) )._childList.get(0) );
System.out.println(""+ ( (TreeNode)tree.getRoot()._childList.get(0) )._childList.get(1) );
System.out.println(""+ ( (TreeNode)tree.getRoot()._childList.get(0) )._childList.get(2) );

System.out.println(""+ ( (TreeNode)tree.getRoot()._childList.get(1) )._childList.get(0) );
System.out.println(""+ ( (TreeNode)tree.getRoot()._childList.get(1) )._childList.get(1) );

}

}

看一下吧!这是在网上找的一个例子!看对你有没有帮助!

Ⅶ 求助大话数据结构中一段中序遍历线索化二叉树的源代码

这个一开始我也没看明白,而且我还马虎的看错了,看到你的问题我才发现自己看错了汗,但是后来仔细推了一下代码,在H点返回的时候 pre的赋值操作是没有意义。此时的pre 就只是一个全局定义的结点变量而已。当H结点的函数递归返回后,此时的pre == H结点,然后执行的是D结点函数的递归,当走到
if(!p->rchild)
{
pre->Rtag=Thread;
pre->rchild=p;
}
这里的时候,正好把,H结点的右指针指向了D。然后在执行 D->i 结点的函数,这个时候就通顺了,不知道你明白了没有,你可以自己在脑海里想一下递归的过程,先不用考虑第一次H结点的赋值。

Ⅷ 数据结构中二叉树的顺序存储结构代码怎么编写

(以下有一段代码,自己先看看学学吧)
数据结构C语言版 二叉树的顺序存储表示和实现
P126
编译环境:Dev-C++ 4.9.9.2
日期:2011年2月13日
*/
#include <stdio.h>
typedef char TElemType;
// 二叉树的顺序存储表示
#define MAX_TREE_SIZE 100 // 二叉树的最大结点数
typedef TElemType SqBiTree[MAX_TREE_SIZE]; // 0号单元存储根结点
typedef struct
{
int level, //结点的层
order; //本层序号(按满二叉树计算)
}position;
typedef int QElemType;
// 队列的顺序存储结构(可用于循环队列和非循环队列)
#define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1)
typedef struct
{
QElemType *base; // 初始化的动态分配存储空间 相当于一个数组
int front; // 头指针,若队列不空,指向队列头元素,相当于一个数组下标
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
// 相当于一个数组下标
}SqQueue;
#define ClearBiTree InitBiTree // 在顺序存储结构中,两函数完全一样
TElemType Nil = ' '; // 设空为字符型的空格符
// 构造空二叉树T。因为T是固定数组,不会改变,故不需要&
int InitBiTree(SqBiTree T)
{
int i;
for(i=0;i<MAX_TREE_SIZE;i++)
T[i]=Nil; // 初值为空
return 1;
}
void DestroyBiTree()
{
// 由于SqBiTree是定长类型,无法销毁
}
// 按层序次序输入二叉树中结点的值(字符型或整型), 构造顺序存储的二叉树T
int CreateBiTree(SqBiTree T)
{
int i = 0, l;
char s[MAX_TREE_SIZE];
printf("请按层序输入结点的值(字符),空格表示空结点,结点数≤%d:\n",
MAX_TREE_SIZE);
printf("例如:abcefgh\n");
gets(s); // 输入字符串
l = strlen(s); // 求字符串的长度
for(;i<l;i++) // 将字符串赋值给T
{
T[i]=s[i];
// 此结点(不空)无双亲且不是根,T[(i+1)/2-1] == Nil表示T[i]无双亲
if(i!=0 && T[(i+1)/2-1] == Nil && T[i] != Nil)
{
printf("出现无双亲的非根结点%c\n",T[i]);
exit(0);
}
}
for(i=l;i<MAX_TREE_SIZE;i++) // 将空赋值给T的后面的结点
T[i]=Nil;
return 1;
}
// 若T为空二叉树,则返回1,否则0
int BiTreeEmpty(SqBiTree T)
{
if(T[0]==Nil) // 根结点为空,则树空
return 1;
else
return 0;
}
// 返回T的深度
int BiTreeDepth(SqBiTree T)
{
int i,j=-1;
for(i=MAX_TREE_SIZE-1;i>=0;i--) // 找到最后一个结点
if(T[i] != Nil)
break;
i++; // 为了便于计算
do
j++;
while(i>=pow(2,j)); //i > pow(2, depth-1) && i <= pow(2, depth)
return j; //j = depth;
}
// 当T不空,用e返回T的根,返回1;否则返回0,e无定义
int Root(SqBiTree T,TElemType *e)
{
if(BiTreeEmpty(T)) // T空
return 0;
else
{
*e=T[0];
return 1;
}
}

// 返回处于位置e(层,本层序号)的结点的值
TElemType Value(SqBiTree T,position e)
{
// 将层、本层序号转为矩阵的序号
return T[((int)pow(2,e.level-1) - 1) + (e.order - 1)];
// ((int)pow(2,e.level-1) - 1)为该e.level的结点个数,
// (e.order - 1)为本层的位置
}

// 给处于位置e(层,本层序号)的结点赋新值value
int Assign(SqBiTree T,position e,TElemType value)
{
// 将层、本层序号转为矩阵的序号
int i = (int)pow(2,e.level-1) + e.order - 2;
if(value != Nil && T[(i+1)/2-1] == Nil) // 叶子非空值但双亲为空
return 0;
else if(value == Nil && (T[i*2+1] != Nil || T[i*2+2] != Nil))
// 双亲空值但有叶子(不空)
return 0;
T[i]=value;
return 1;
}

// 若e是T的非根结点,则返回它的双亲,否则返回"空"
TElemType Parent(SqBiTree T,TElemType e)
{
int i;
if(T[0]==Nil) // 空树
return Nil;
for(i=1;i<=MAX_TREE_SIZE-1;i++)
if(T[i]==e) // 找到e
return T[(i+1)/2-1];
return Nil; // 没找到e
}

// 返回e的左孩子。若e无左孩子,则返回"空"
TElemType LeftChild(SqBiTree T,TElemType e)
{
int i;
if(T[0]==Nil) // 空树
return Nil;
for(i=0;i<=MAX_TREE_SIZE-1;i++)
if(T[i]==e) // 找到e
return T[i*2+1];
return Nil; // 没找到e
}

// 返回e的右孩子。若e无右孩子,则返回"空"
TElemType RightChild(SqBiTree T,TElemType e)
{
int i;
if(T[0]==Nil) // 空树
return Nil;
for(i=0;i<=MAX_TREE_SIZE-1;i++)
if(T[i]==e) // 找到e
return T[i*2+2];
return Nil; // 没找到e
}

// 返回e的左兄弟。若e是T的左孩子或无左兄弟,则返回"空"
TElemType LeftSibling(SqBiTree T,TElemType e)
{
int i;
if(T[0]==Nil) // 空树
return Nil;
for(i=1;i<=MAX_TREE_SIZE-1;i++)
if(T[i] == e && i%2 == 0) // 找到e且其序号为偶数(是右孩子)
return T[i-1];
return Nil; // 没找到e
}

// 返回e的右兄弟。若e是T的右孩子或无右兄弟,则返回"空"
TElemType RightSibling(SqBiTree T,TElemType e)
{
int i;

if(T[0]==Nil) // 空树
return Nil;
for(i=1;i<=MAX_TREE_SIZE-1;i++)
if(T[i]==e&&i%2) // 找到e且其序号为奇数(是左孩子)
return T[i+1];
return Nil; // 没找到e
}

// 把从q的j结点开始的子树移为从T的i结点开始的子树
// InsertChild()用到
void Move(SqBiTree q,int j,SqBiTree T,int i)
{
if(q[2*j+1] != Nil) // q的左子树不空
Move(q,(2*j+1),T,(2*i+1)); // 把q的j结点的左子树移为T的i结点的左子树
if(q[2*j+2] != Nil) // q的右子树不空
Move(q,(2*j+2),T,(2*i+2)); // 把q的j结点的右子树移为T的i结点的右子树
T[i]=q[j]; // 把q的j结点移为T的i结点
q[j]=Nil; // 把q的j结点置空
}

// 根据LR为0或1,插入c为T中p结点的左或右子树。p结点的原有左或
// 右子树则成为c的右子树
int InsertChild(SqBiTree T,TElemType p,int LR,SqBiTree c)
{
int j,k,i=0;
for(j=0;j<(int)pow(2,BiTreeDepth(T))-1;j++) // 查找p的序号
if(T[j]==p) // j为p的序号
break;
k=2*j+1+LR; // k为p的左或右孩子的序号
if(T[k] != Nil) // p原来的左或右孩子不空
Move(T,k,T,2*k+2); // 把从T的k结点开始的子树移为从k结点的右子树开始的子树
Move(c,i,T,k); // 把从c的i结点开始的子树移为从T的k结点开始的子树
return 1;
}

// 构造一个空队列Q
int InitQueue(SqQueue *Q)
{
(*Q).base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType)); //分配定长的空间,相当于一个数组
if(!(*Q).base) // 存储分配失败
exit(0);
(*Q).front=(*Q).rear=0; //初始化下标
return 1;
}

// 插入元素e为Q的新的队尾元素
int EnQueue(SqQueue *Q,QElemType e)
{
if((*Q).rear>=MAXQSIZE)
{ // 队列满,增加1个存储单元
(*Q).base=(QElemType *)realloc((*Q).base,((*Q).rear+1)*sizeof(QElemType));
if(!(*Q).base) // 增加单元失败
return 0;
}
*((*Q).base+(*Q).rear)=e;
(*Q).rear++;
return 1;
}

// 若队列不空,则删除Q的队头元素,用e返回其值,并返回1,否则返回0
int DeQueue(SqQueue *Q,QElemType *e)
{
if((*Q).front==(*Q).rear) // 队列空
return 0;
*e=(*Q).base[(*Q).front];
(*Q).front=(*Q).front+1;
return 1;
}

// 根据LR为1或0,删除T中p所指结点的左或右子树
int DeleteChild(SqBiTree T,position p,int LR)
{
int i;
int k=1; // 队列不空的标志
SqQueue q;
InitQueue(&q); // 初始化队列,用于存放待删除的结点
i=(int)pow(2,p.level-1)+p.order-2; // 将层、本层序号转为矩阵的序号
if(T[i]==Nil) // 此结点空
return 0;
i=i*2+1+LR; // 待删除子树的根结点在矩阵中的序号
while(k)
{
if(T[2*i+1]!=Nil) // 左结点不空
EnQueue(&q,2*i+1); // 入队左结点的序号
if(T[2*i+2]!=Nil) // 右结点不空
EnQueue(&q,2*i+2); // 入队右结点的序号
T[i]=Nil; // 删除此结点
k=DeQueue(&q,&i); // 队列不空
}
return 1;
}

int(*VisitFunc)(TElemType); // 函数变量

void PreTraverse(SqBiTree T,int e)
{
// PreOrderTraverse()调用
VisitFunc(T[e]); //先调用函数VisitFunc处理根
if(T[2*e+1]!=Nil) // 左子树不空
PreTraverse(T,2*e+1); //然后处理左子树
if(T[2*e+2]!=Nil) // 右子树不空
PreTraverse(T,2*e+2);
}

// 先序遍历T,对每个结点调用函数Visit一次且仅一次。
int PreOrderTraverse(SqBiTree T,int(*Visit)(TElemType))
{
VisitFunc=Visit;
if(!BiTreeEmpty(T)) // 树不空
PreTraverse(T,0);
printf("\n");
return 1;
}

// InOrderTraverse()调用
void InTraverse(SqBiTree T,int e)
{
if(T[2*e+1]!=Nil) // 左子树不空
InTraverse(T,2*e+1);
VisitFunc(T[e]);
if(T[2*e+2]!=Nil) // 右子树不空
InTraverse(T,2*e+2);
}

// 中序遍历T,对每个结点调用函数Visit一次且仅一次。
int InOrderTraverse(SqBiTree T,int(*Visit)(TElemType))
{
VisitFunc=Visit;
if(!BiTreeEmpty(T)) // 树不空
InTraverse(T,0);
printf("\n");
return 1;
}

// PostOrderTraverse()调用
void PostTraverse(SqBiTree T,int e)
{
if(T[2*e+1]!=Nil) // 左子树不空
PostTraverse(T,2*e+1);
if(T[2*e+2]!=Nil) // 右子树不空
PostTraverse(T,2*e+2);
VisitFunc(T[e]);
}

// 后序遍历T,对每个结点调用函数Visit一次且仅一次。
int PostOrderTraverse(SqBiTree T,int(*Visit)(TElemType))
{
VisitFunc = Visit;
if(!BiTreeEmpty(T)) // 树不空
PostTraverse(T,0);
printf("\n");
return 1;
}

// 层序遍历二叉树
void LevelOrderTraverse(SqBiTree T,int(*Visit)(TElemType))
{
int i=MAX_TREE_SIZE-1,j;
while(T[i] == Nil)
i--; // 找到最后一个非空结点的序号
for(j=0;j<=i;j++) // 从根结点起,按层序遍历二叉树
if(T[j] != Nil)
Visit(T[j]); // 只遍历非空的结点
printf("\n");
}

// 逐层、按本层序号输出二叉树
void Print(SqBiTree T)
{
int j,k;
position p;
TElemType e;
for(j=1;j<=BiTreeDepth(T);j++)
{
printf("第%d层: ",j);
for(k=1; k <= pow(2,j-1);k++)
{
p.level=j;
p.order=k;
e=Value(T,p);
if(e!=Nil)
printf("%d:%c ",k,e);
}
printf("\n");
}
}

int visit(TElemType e)
{
printf("%c ",e);
return 0;
}

int main()
{
int i,j;
position p;
TElemType e;
SqBiTree T,s;
InitBiTree(T);

CreateBiTree(T);
printf("建立二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",
BiTreeEmpty(T),BiTreeDepth(T));
i=Root(T,&e);
if(i)
printf("二叉树的根为:%c\n",e);
else
printf("树空,无根\n");
printf("层序遍历二叉树:\n");
LevelOrderTraverse(T,visit);
printf("中序遍历二叉树:\n");
InOrderTraverse(T,visit);
printf("后序遍历二叉树:\n");
PostOrderTraverse(T,visit);
printf("请输入待修改结点的层号 本层序号: ");
scanf("%d%d%*c",&p.level,&p.order);
e=Value(T,p);
printf("待修改结点的原值为%c请输入新值: ",e);
scanf("%c%*c",&e);
Assign(T,p,e);
printf("先序遍历二叉树:\n");
PreOrderTraverse(T,visit);
printf("结点%c的双亲为%c,左右孩子分别为",e,Parent(T,e));
printf("%c,%c,左右兄弟分别为",LeftChild(T,e),RightChild(T,e));
printf("%c,%c\n",LeftSibling(T,e),RightSibling(T,e));
InitBiTree(s);
printf("建立右子树为空的树s:\n");
CreateBiTree(s);
printf("树s插到树T中,请输入树T中树s的双亲结点 s为左(0)或右(1)子树: ");
scanf("%c%d%*c",&e,&j);
InsertChild(T,e,j,s);
Print(T);
printf("删除子树,请输入待删除子树根结点的层号 本层序号 左(0)或右(1)子树: ");
scanf("%d%d%d%*c",&p.level,&p.order,&j);
DeleteChild(T,p,j);
Print(T);
ClearBiTree(T);
printf("清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",
BiTreeEmpty(T),BiTreeDepth(T));
i=Root(T,&e);
if(i)
printf("二叉树的根为:%c\n",e);
else
printf("树空,无根\n");

system("pause");
return 0;
}

/*
输出效果:

请按层序输入结点的值(字符),空格表示空结点,结点数≤100:
例如:abcefgh
abcdefgh
建立二叉树后,树空否?0(1:是 0:否) 树的深度=4
二叉树的根为:a
层序遍历二叉树:
a b c d e f g h
中序遍历二叉树:
h d b e a f c g
后序遍历二叉树:
h d e b f g c a
请输入待修改结点的层号 本层序号: 3 2
待修改结点的原值为e请输入新值: i
先序遍历二叉树:
a b d h i c f g
结点i的双亲为b,左右孩子分别为 , ,左右兄弟分别为d,
建立右子树为空的树s:
请按层序输入结点的值(字符),空格表示空结点,结点数≤100:
例如:abcefgh
jk l
树s插到树T中,请输入树T中树s的双亲结点 s为左(0)或右(1)子树: i 0
第1层: 1:a
第2层: 1:b 2:c
第3层: 1:d 2:i 3:f 4:g
第4层: 1:h 3:j
第5层: 5:k
第6层: 9:l
删除子树,请输入待删除子树根结点的层号 本层序号 左(0)或右(1)子树: 2 1 0
第1层: 1:a
第2层: 1:b 2:c
第3层: 2:i 3:f 4:g
第4层: 3:j
第5层: 5:k
第6层: 9:l
清除二叉树后,树空否?1(1:是 0:否) 树的深度=0
树空,无根
请按任意键继续. . .
*/

Ⅸ 二叉树按层次建立的源代码

typedef struct bnode_s{
char ch;
struct bnode_s *lchild, *rchild;
}BNode,*BTree;
typedef struct{
BTree bt[MAXLEN];
int rear,front;
}Queue_Tree,*PQueue_Tree;

PQueue_Tree Init_Queue_Tree();
int Empty_Queue(PQueue_Tree Pqt);
void In_Queue_Tree(PQueue_Tree Pqt,BTree t);
BTree Out_Queue_Tree(PQueue_Tree Pqt);
BTree CreatBinTree(PQueue_Tree Pqt);
void PreOrder(BTree t);
int max(int, int);
int Height(BTree t);

int main()
{
PQueue_Tree Pqt;
BTree t;
Pqt = Init_Queue_Tree();
t = CreatBinTree(Pqt);
PreOrder(t);
printf("\n");
int h = Height(t);
printf("%d\n",h);
return 0;
}

PQueue_Tree Init_Queue_Tree()
{
PQueue_Tree Pqt;
Pqt = (PQueue_Tree)malloc(sizeof(Queue_Tree));
if(Pqt){
Pqt->rear = 0;
Pqt->front = 0;
}
return Pqt;
}

int Empty_Queue(PQueue_Tree Pqt)
{
return Pqt->rear == Pqt->front;
}

void In_Queue_Tree(PQueue_Tree Pqt,BTree t)
{
if((Pqt->rear + 1) % MAXLEN == Pqt->front){
printf("Queue overflow !\n");
exit(0);
}
Pqt->rear = (Pqt->rear + 1) % MAXLEN;
Pqt->bt[Pqt->rear] = t;
}

BTree Out_Queue_Tree(PQueue_Tree Pqt)
{
BTree t;
if(Empty_Queue(Pqt)){
printf("Queue underflow !\n");
exit(0);
}
Pqt->front = (Pqt->front + 1) % MAXLEN;
t = Pqt->bt[Pqt->front];
return t;
}

BTree CreatBinTree(PQueue_Tree Pqt)
{
char c, c1, c2;
BTree t, t1, t2;
c = getchar();
if(c != '*'){
t = (BTree)malloc(sizeof(BNode));
t->ch = c;
In_Queue_Tree(Pqt, t);
}else{
return NULL;
}
BTree p = t;
while(!Empty_Queue(Pqt)){
t = Out_Queue_Tree(Pqt);
c1 = getchar();
if(c1 != '*'){
t1 = (BTree)malloc(sizeof(BNode));
t1->ch = c1;
t->lchild = t1;
In_Queue_Tree(Pqt, t1);
}else{
t->lchild = NULL;
}
c2 = getchar();
if(c2 != '*'){
t2 = (BTree)malloc(sizeof(BNode));
t2->ch = c2;
t->rchild = t2;
In_Queue_Tree(Pqt, t2);
}else{
t->rchild = NULL;
}
}
return p;
}

热点内容
phpmyadmin上传限制 发布:2025-05-15 15:39:52 浏览:429
如何给手机配置真正的电脑 发布:2025-05-15 15:39:52 浏览:762
抽脚本命令 发布:2025-05-15 15:39:45 浏览:658
sok编程 发布:2025-05-15 15:33:21 浏览:39
lms算法程序 发布:2025-05-15 15:31:53 浏览:568
数据库二级映射 发布:2025-05-15 15:14:09 浏览:476
3d文件加密 发布:2025-05-15 15:05:17 浏览:361
jquery拖拽上传图片 发布:2025-05-15 14:53:36 浏览:129
我的世界电脑服务器需要正版吗 发布:2025-05-15 14:38:53 浏览:694
大华录像机哪里有安卓设备 发布:2025-05-15 14:25:06 浏览:808