「打印二叉树java」打印二叉树的边界节点
今天给各位分享打印二叉树java的知识,其中也会对打印二叉树的边界节点进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、请问java 2叉树里,怎样可以打印出来树形结构样子?
- 2、java中把数组以二叉树形式打印出来
- 3、打印二叉排序树
- 4、打印二叉树结构)按凹入表形式横向打印任意二叉树的结构,即二叉树的根在屏幕的最左边,二叉%C
- 5、如何将二叉树的节点分层打印出来
- 6、如何打印二叉树
请问java 2叉树里,怎样可以打印出来树形结构样子?
呵呵,这个问题不是那么简单的。
你首先要自己定义一个代表二叉树的类BinaryTree,然后在它里面写一个方法display(),然后在这个方法里自己控制这个二叉树的显示。
java中把数组以二叉树形式打印出来
你说的意思应该是用数组的方式存储二叉树,这需要利用到完全二叉树的性质,
,完全二叉树通常采用数组而不是链表存储,其存储结构如下:
var
tree:array[1..n]of
longint;{n:integer;n=1}
对于tree[i],有如下特点:
(1)若i为奇数且i1,那么tree的左兄弟为tree[i-1];
(2)若i为偶数且in,那么tree的右兄弟为tree[i+1];
(3)若i1,tree的双亲为tree[i
div
2];
(4)若2*i=n,那么tree的左孩子为tree[2*i];若2*i+1=n,那么tree的右孩子为tree[2*i+1];
(5)若in
div
2,那么tree[i]为叶子结点(对应于(3));
(6)若i(n-1)
div
2.那么tree[i]必有两个孩子(对应于(4))。
(7)满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
完全二叉树第i层至多有2^(i-1)个节点,共i层的完全二叉树最多有2^i-1个节点。
代码简单,网上很多,不懂也可以问我
打印二叉排序树
#include stdio.h
#include string.h
#include stdlib.h
#define NULL 0
#define MAXlevel 10
typedef struct BiTNode
{
char data[20];
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; /*用递归法建立二叉树*/
BiTree Create(BiTree T)
{
char ch[20];
scanf("%s",ch);
if(ch[0]==35)
T=NULL; /*用#表示某结点的左右子树是否为空,用于表示该结点是否为叶子或者可能存在左子树or右子树*/
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
printf("Error!");
strcpy(T-data,ch); /*输入T的data的值*/
T-lchild=Create(T-lchild);
T-rchild=Create(T-rchild);
} /*用先序的方法依次输入二叉树的结点的data值*/
return T;
}
void ShowTree(BiTree T,int deep) /*凹入表示法输出二叉树T,deep用于分层显示各节点的关系*/
{
deep++;
int i;
if(T==NULL)return ; /*递归结束*/
printf("\n%s ",T-data);
for(i=0;iMAXlevel-deep;i++) printf("----"); /*输出各节点的线条*/
ShowTree(T-lchild,deep); /*打印左子树*/
ShowTree(T-rchild,deep); /*打印右子树*/
}
void Preorder(BiTree T)
{
if(T)
{
printf(" %s",T-data); /*输出根节点*/
Preorder(T-lchild);
Preorder(T-rchild);
} /*先序遍历*/
}
void zhongxu(BiTree T)
{
if(T){
zhongxu(T-lchild);
printf(" %s",T-data); /*递归左子树之后输出根节点*/
zhongxu(T-rchild);
}
} /*中序遍历*/
void houxu(BiTree T)
{
if(T)
{
houxu(T-lchild);
houxu(T-rchild);
printf(" %s",T-data); /*与先序遍历相反最后输出根节点*/
}
} /*后序遍历*/
void Levelorder(BiTree T) /*模拟队列先进先出的特点层次遍历二叉树*/
{
BiTNode *Queue[20],*b; /*定义结点的指针数组*/
int front,rear;
front=rear=0;
if (T)
{
Queue[rear++]=T; /*Queue[0]指向T,置rear=1*/
while (front!=rear)
{
b=Queue[front++]; /*b通过循环依次指向Queue[0],Queue[1],..*/
printf(" %s",b-data);
if(b-lchild!=NULL)
Queue[rear++]=b-lchild; /*通过循环将Queue[2*i+1](i=0,1,...),依次指向根结点的左子树、左子树的左子树...*/
if(b-rchild!=NULL)
Queue[rear++]=b-rchild; /*通过循环将Queue[2*i+1](i=0,1,...),依次指向根结点的左子树、左子树的左子树...*/
}
}
} /*层次遍历*/
void exchange(BiTree rt)/*交换二叉树的所有子树*/
{
BiTree temp = NULL;
if(rt-lchild == NULL rt-rchild == NULL) return; /*若二叉树的左右子树均为空则返回*/
else
{
temp = rt-lchild;
rt-lchild = rt-rchild;
rt-rchild = temp;
} /*交换子树*/
if(rt-lchild)exchange(rt-lchild);
if(rt-rchild)exchange(rt-rchild); /*对二叉树的左右子树分别交换*/
} /*交换该二叉树所有子树*/
int DestroyBiTree(BiTree T) /*删除二叉树T*/
{
if (T==NULL) return 1; /*当T为空的时候递归结束*/
DestroyBiTree(T-lchild);
DestroyBiTree(T-rchild); /*对左右子树进行操作*/
delete T;
T = NULL; /*删除并将T置为空*/
return 1;
} /*删除二叉树T*/
void findx(BiTree T,char *ch)
{
if(strcmp(T-data,ch)==0)DestroyBiTree(T); /*判断树根的内容是否与字符串ch相同相同则删除整棵树*/
else if(T)
{
if(strcmp(T-lchild-data,ch)==0) /*判断其左孩子的内容是否与字符串ch相同*/
{
DestroyBiTree(T-lchild);
T-lchild =NULL;
return ; /*若相同则删去其左孩子及其子树然后将其双亲指向该结点的指针置空而后返回*/
}
if(strcmp(T-rchild-data,ch)==0)
{
DestroyBiTree(T-rchild);
T-rchild =NULL;
return ; /*判断其左孩子的内容是否与字符串ch相同,若相同则删去其左孩子及其子树然后将其双亲指向该结点的指针置空而后返回*/
}
}
else
{
findx(T-lchild,ch);
findx(T-rchild,ch); /*递归对其左右子树进行相同操作*/
}
} /*删除所输入结点及其子树*/
void main(){
char jiedian[20];
BiTree T;
int sum,dep;
T=Create(T);
printf("\n该树按照凹入表示法表示为:");
ShowTree(T,0); /*用凹入表示法打印该树*/
printf("\n\n该树的先序遍历序列为:\n");
Preorder(T); /*输出该树的先序遍历*/
printf("\n该树的中序遍历序列为:\n");
zhongxu(T); /*输出该树的中序遍历*/
printf("\n该树的后序遍历序列为:\n");
houxu(T); /*输出该树的后序遍历*/
printf("\n该树的层次遍历序列为\n");
Levelorder(T);
printf("\n\n交换左右子树后的树按照凹入表示法表示为:");
exchange(T);
ShowTree(T,0); /*用凹入表示法打印交换所有子树后的得到树*/
printf("\n请输入待删除结点内容:\n");
scanf("%s",jiedian);
findx(T,jiedian); /*删除所输入结点及其子树*/
printf("删除所输入结点及其子树后的二叉树用凹入法表示为:");
ShowTree(T,0); /*用凹入法表示法输出删除所要求结点及其子树之后的二叉树*/
printf("\n");
}
参考使用,请勿照抄!
打印二叉树结构)按凹入表形式横向打印任意二叉树的结构,即二叉树的根在屏幕的最左边,二叉%C
/*
打印二叉树
*/
#include
"stdio.h"
#include
"stdlib.h"
/****二叉链树的类型定义****/
typedef
char
TElemType;
typedef
struct
BiTNode
{
TElemType
data;
struct
BiTNode
*lchild,*rchild;
}
BiTNode,
*BiTree;
/****先序建立二叉树****/
void
CreateBiTree(BiTree
*T)
{
char
ch;
scanf("%c",ch);
if
(ch=='
')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
(*T)-data=ch;
CreateBiTree((*T)-lchild);
CreateBiTree((*T)-rchild);
}
}
/****RDL遍历二叉树****/
void
RDLTraverse(BiTree
T)
{
if
(T)
{RDLTraverse(T-rchild);
printf("%2c",T-data);
RDLTraverse(T-lchild);
}
}
/****计算二叉树的深度****/
int
BiTreeDepth(BiTree
T)
{
int
h1,h2,h;
if
(T==NULL)
return
0;
else
{
h1=BiTreeDepth(T-lchild);
h2=BiTreeDepth(T-rchild);
if
(h1h2)
h=h1+1;
else
h=h2+1;
}
return
h;
}
/****打印二叉树****/
void
DaYin(BiTree
T,n)
{
int
i;
if(T)
{
DaYin(T-rchild,n+1);
for(i=BiTreeDepth(T);i
data);
printf("\n");
DaYin(T-lchild,n+1);
}
}
/****主函数****/
main()
{
BiTree
T;
printf("先序输入二叉树:\n");
CreateBiTree(T);
printf("输出打印二叉树结果:\n");
DaYin(T,1);
printf("\n");
}
如何将二叉树的节点分层打印出来
你指的是层序打印吗?
二叉树的节点层序打印要使用“队列”
代码为:
void Order(BinTreeNode *root) //BinTreeNode是二叉树结点,root为二叉树的根结点
{
QueueBinTreeNode* Q; //定义一个二叉树结点指针类型的队列
BinTreeNode *p=root; //将根结点传给一个P指针
Q.EnQueue(p); //根结点入队
while(!Q.IsEmpty()) //当队列不空的时候,执行下列操作,队列不空说明还没遍历完
{
Q.DeQueue(p); visit(p); //P出队,并访问P
if(p-leftchild!=NULL) Q.EnQueue(p-leftchild); //如果P的左孩子不空,左孩子入队
if(p-rightchild!=NULL) Q.EnQueue(p-rightchild); //如果P的右孩子不空,右孩子入队
}
}
这段代码的整个逻辑要仔细想想清楚哦~
还有,如果是层序打印,楼上的说法,递归是无法做到的。
这是将树分层打印的代码,正确无误!
void LevelOrder(BinTreeNode *tree)
{
QueueBinTreeNode * Q1,Q2;
BinTreeNode *p=tree;
Q1.EnQueue(p);
while(!(Q1.IsEmpty() Q2.IsEmpty()))
{
while(!Q1.IsEmpty())
{
Q1.DeQueue(p);
coutp-data" ";
if(p-leftchild!=NULL) Q2.EnQueue(p-leftchild);
if(p-rightchild!=NULL) Q2.EnQueue(p-rightchild);
}
coutendl;
while(!Q2.IsEmpty())
{
Q2.GetQueue(p); //这是队列的一个方法,让P指向队首元素
Q2.DeQueue(p);
coutp-data" ";
if(p-leftchild!=NULL) Q1.EnQueue(p-leftchild);
if(p-rightchild!=NULL) Q1.EnQueue(p-rightchild);
}
coutendl;
}
}
如何打印二叉树
这个先容易的,用递归法就行了。
void MyTree::PrePrintf(TreeNode * lpCurNode,typefun lpfun)
{
MyStackTreeNode * stack;
while(true)
{
while (lpCurNode)
{
if (lpfun!=NULL)
{
(this-*lpfun)(lpCurNode);
stack.Push(lpCurNode);
}
lpCurNode=lpCurNode-m_lpLeft;
}
if (!stack.Pop(lpCurNode))
{
break;
}
lpCurNode=lpCurNode-m_lpRight;
}
}
void MyTree::MidPrintf(TreeNode * lpCurNode,typefun lpfun)
{
MyStackTreeNode * stack;
while (true)
{
while(lpCurNode)
{
stack.Push(lpCurNode);
lpCurNode=lpCurNode-m_lpLeft;
}
if (!stack.Pop(lpCurNode)) //出PUSH
{
break;
}
if (lpfun!=NULL)
{
(this-*lpfun)(lpCurNode); //输出然后再if右边有没有值,有再进PUSH
}
lpCurNode=lpCurNode-m_lpRight;
}
}
void MyTree::AftPrintf(TreeNode * lpCurNode,typefun lpfun)
{
MyStackTreeNode * stack;
TreeNode* lpFang=NULL;
while(true)
{
while(lpCurNode)
{
stack.Push(lpCurNode);
lpCurNode=lpCurNode-m_lpLeft;
}
if (!stack.Pop(lpCurNode))
{
break;
}
if (lpCurNode-m_lpRight==NULL||lpCurNode-m_lpRight==lpFang)
{
lpFang=lpCurNode;
if (lpfun!=NULL)
{
(this-*lpfun)(lpCurNode);
}
lpCurNode=NULL;
continue;
}
else
stack.Push(lpCurNode);
lpCurNode=lpCurNode-m_lpRight;
}
}
打印二叉树java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于打印二叉树的边界节点、打印二叉树java的信息别忘了在本站进行查找喔。