数据结构中,怎么写二叉树查找双亲的伪代码?急!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构中,怎么写二叉树查找双亲的伪代码?急!相关的知识,希望对你有一定的参考价值。
要求写出在二叉树中,查找任意指定结点的双亲的伪代码。
分别要求从根节点开始的算法,和自下而上的算法
急。。。只有这么多悬赏了,谢谢帮助啊。。。。
从根出发应该这样写
Node* Parent(Node* r, datatype data, Node* parent)/*主调函数调用Parent函数时,parent参数初始化为NULL*/
Node* p;
if(r == NULL) return NULL;
if(r->data == data) return parent;
if((p = Parent(r->lchild, data, r)) != NULL)
return p;
return Parent(r->rchild, data, r);
注意本函数parent参数的作用,如果缺少该参数将无法求根的双亲。
自下而上,考虑用顺序存储表示。设MaxSize表示对应的完全二叉树的规模,根的下标为1。则如下函数寻找指定数据的双亲的下标,如果返回0表示无双亲。
int Parent(Node *tree, datatype data)
int i;
for(i = MaxSize, tree[0] = data; tree[i] != data; i--) ;
return i / 2;
参考技术A 自上而下的算法。
link parent(BiTree t, link p)
link templink=null;
if(p==t.lchild||p==t.rchild)
templink=t;
else
templink=parent(t.lchild,p);
if(templink==null) templink=parent(t.rchild,p);
return templink;
求数据结构(C语言版)建立二叉树的代码~~急~~谢谢了
建立一个二叉树:
(1)输出其对应的中,先,后根序列
(2)输出树中结点所在的层数
(3)输出树中叶子数
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
#define Stack_Size 50
#define NUM 50
#define MAXSIZE 50 //队列的最大长度
//定义二叉树
typedef char DataType;
typedef struct Node
DataType data;
struct Node *LChild;
struct Node *RChild;
BiTNode, *BiTree;
//定义stack
typedef BiTree StackElementType;
typedef struct
StackElementType elem[Stack_Size];
int top;
SeqStack;
//定义队列
typedef BiTree QueueElementType;
typedef struct
QueueElementType element[MAXSIZE];
int front;
int rear;
SeqQueue;
//队列的抽象
void InitQueue(SeqQueue *Q)
Q->front=Q->rear=0;
int EnterQueue(SeqQueue *Q, QueueElementType x)
if((Q->rear+1)%MAXSIZE==Q->front)
return(FALSE);
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE;
return(TRUE);
参考技术A 第一个是一个cpp文件
#include "bt.h"
void main()
BiTree T;
int layer=0;
printf("按扩展先序遍历序列建立二叉树,请输入序列:\n");
CreateBiTree(&T);
//三个递归
printf("先序递归遍历输出序列为:");
PreOrder(T);
printf("\n中序递归遍历输出序列为:");
InOrder(T);
printf("\n后序递归遍历输出序列为:");
PostOrder(T);
//三个非递归
printf("\n先序非递归遍历输出序列为:");
PreNoOrder(T);
printf("\n中序非递归遍历输出序列为:");
InNoOrder(T);
printf("\n后序非递归遍历输出序列为:");
PostNoOrder(T);
//一个层次
printf("\n层次遍历输出结点为:");
LayerOrder(T);
printf("\n按树状打印二叉树\n");
PrintTree(T,layer);
int h=PostTreeDepth(T);
printf("\n二叉树高度为: %d\n",h);
int lc=leaf(T);
printf("二叉树的叶子节点数目: %d\n",lc);
参考技术B 再接
//中序非递归
void InNoOrder(BiTree root)
int top=0;
BiTree p;
BiTree s[Stack_Size];
int m;
m = Stack_Size-1;
p = root;
do
while(p!=NULL)
if (top>m) return;
top=top+1;
s[top]=p;
p=p->LChild;
;
if(top!=0)
p=s[top];
top=top-1;
Visit(p->data);
p=p->RChild;
while(p!=NULL || top!=0);
//后序非递归
void PostNoOrder(BiTree root)
BiTNode *p,*q;
BiTNode **s;
int top=0;
q=NULL;
p=root;
s=(BiTNode**)malloc(sizeof(BiTNode*)*NUM);
while(p!=NULL || top!=0)
while(p!=NULL)
top++;
s[top]=p;
p=p->LChild;
if(top>0)
p=s[top];
if((p->RChild==NULL) ||(p->RChild==q))
Visit(p->data);
q=p;
top--;
p=NULL;
else
p=p->RChild;
free(s);
//层次遍历二叉树
int LayerOrder(BiTree bt)
SeqQueue *Q;
BiTree p;
Q=(SeqQueue *)malloc(sizeof(SeqQueue));
InitQueue(Q);
if(bt == NULL)
return ERROR;
EnterQueue(Q, bt);
while(!IsEmpty(Q))
DeleteQueue(Q, &p);
printf("%c ",p->data);
if(p->LChild )
EnterQueue(Q, p->LChild);
if(p->RChild )
EnterQueue(Q, p->RChild);
return OK;
//后序求二叉树高度
int PostTreeDepth(BiTree bt)
int hl,hr,max;
if(bt!=NULL)
hl=PostTreeDepth(bt->LChild);
hr=PostTreeDepth(bt->RChild);
max=hl>hr?hl:hr;
return(max+1);
else return(0);
//
int leaf(BiTree root)
int LeafCount;
if(root==NULL)
LeafCount=0;
else if((root->LChild==NULL)&&(root->RChild==NULL))
LeafCount=1;
else
LeafCount=leaf(root->LChild)+leaf(root->RChild);
return LeafCount;
//按树状打印二叉树
void PrintTree(BiTree bt,int nLayer)
if(bt==NULL)return;
PrintTree(bt->RChild,nLayer+1);
for(int i=0;i<nLayer;i++)
printf(" ");
printf("%c\n",bt->data);
PrintTree(bt->LChild,nLayer+1);
参考技术C 接着上面的
int DeleteQueue(SeqQueue *Q, QueueElementType *x)
if(Q->front==Q->rear)
return(FALSE);
*x=Q->element[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return(TRUE);
int IsEmpty(SeqQueue *Q)
if(Q->front==Q->rear)
return(TRUE);
else
return(FALSE);
//输出函数
void Visit(char ch)
printf("%c ",ch);
//扩展先序遍历创建二叉树
void CreateBiTree(BiTree *bt)
char ch;
ch = getchar();
if(ch=='.') *bt=NULL;
else
*bt=(BiTree)malloc(sizeof(BiTNode));
(*bt)->data=ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
//先序递归遍历输出二叉树
void PreOrder(BiTree root)
if (root!=NULL)
Visit(root->data);
PreOrder(root ->LChild);
PreOrder(root ->RChild);
//中序递归遍历输出二叉树
void InOrder(BiTree root)
if(root!=NULL)
InOrder(root->LChild);
Visit(root->data);
InOrder(root->RChild);
//后序递归
void PostOrder(BiTree root)
if(root!=NULL)
PostOrder(root->LChild);
PostOrder(root->RChild);
Visit(root->data);
//先序非递归
void PreNoOrder(BiTree root)
int top=0;
BiTree p;
BiTree s[Stack_Size];
int m;
m = Stack_Size-1;
p = root;
do
while(p!=NULL)
if (top>m) return;
Visit(p->data);
top=top+1;
s[top]=p;
p=p->LChild;
;
if(top!=0)
p=s[top];
top=top-1;
p=p->RChild;
while(p!=NULL || top!=0);
以上是关于数据结构中,怎么写二叉树查找双亲的伪代码?急!的主要内容,如果未能解决你的问题,请参考以下文章