数据结构C语言树

二叉树的存储结构
顺序存储:适合于完全二叉树

链式存储:
定义

typedef struct BTNode{
	char data;
	struct BTNode *lchild;
	struct BTNode *rchild;
}BTNode;

递归遍历:先序,中序,后序

先序

void preorder(BTNode *p){
	if(p!=NULL){
		Visit(p);
		preorder(p->lchild);
		preorder(p->rchild);
	}
}

中序

void inorder(BTNode *p){
	if(p!=NULL){
		inorder(p->lchild);
		Visit(p);
		inorder(p->rchild);
	}
}

后序

void postorder(BTNode *p){
	if(p!=NULL){
		postorder(p->lchild);
		postorder(p->rchild);
		Visit(p);
	}
}

写一个算法求一颗二叉树的高度

int getDepth(BTNode *p){
	int LD,RD;
	if(p==NULL)
		return 0
	else
	{
		LD=getDepth(p->lchild);
		RD=getDepth(p->rchild);
		return (LD>RD?LD:RD)+1;
	}
}

在一颗以二叉链表为存储结构的二叉树中,查找data域值等于key的结点是否存在(找到任何一个就可以),如果存在则将q指向该结点,否则q赋值为NULL
分析:三种遍历方法都可以查到一棵树的每一个结点

void search(BTNode *p,BTNode *&q ,int key)
//q定义为引用型指针因为q要改变
	if(p!=NULL){
		if(p->data==key)
			q=p;
		else
		{
			search(p->lchild,q,key);
			search(p->rchild,q,key);
		}
	}

假设二叉树采用二叉链表存储结构存储,输出先序遍历中第k个节点的值

int n=0;
void trave(BTNode *p,int k){
	if(p!=NULL){
		++n;
		if(k==n){
			cout<<p->data<<endl;
			return;
		}
		trave(p->lchild,k);
		trave(p->rchild,k);
	}
}

层次遍历
建立循环队列,先将二叉树头节点入队列,然后出队列,访问该结点,如果他有左子树,则将左子树的根节点入队,如果他有右子树,则将右子树的根节点入队,然后出队,对出队结点进行访问,如此反复,直至队列为空为止。

void level(BTNode *p){
	int front,rear;
	BTNode *que[maxSize];
	front=rear=0;
	BTNode *q;
	if(p!=NULL){
		rear=(rear+1)%maxSize;
		que[rear]=p;//根节点入队
		while(front!=rear){
			front=(front+1)%maxSize;
			q=que[front];
			Visit(q);
			if(q->lchild!=NULL){
				rear=(rear+1)%maxSize;
				que[rear]=q->lchild;
			}
			if(q->rchild!=NULL){
				rear=(rear+1)%maxSize;
				que[rear]=q->rchild;
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值