二叉树(2)

更新一下非递归方式对二叉树的部分函数,关键是如何实现非递归前序遍历。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

typedef struct _data{
	int id;
	char name[20];
}data;

typedef struct _bnode{
	data *d;
	struct _bnode *parent,*left,*right;
}bnode;

typedef struct _btree{
	bnode *root;
}btree;
 

//利用 btree_get_next_node实现非递归方式前序遍历
void btree_non_recursive_iterate(btree *t){
	bnode *n=t->root;
	while(n!=NULL){
		printf("%\n%d",n->d->id);
		n=btree_get_next_node(n);
	}
}

//利用btree_get_next_node,实现非递归方式查找,时间和空间复杂度都好于递归方式 
bnode *btree_non_recursive_find_node(btree *t, int id){
	bnode *n=t->root;
	while(n!=NULL){
		if(n->d->id==id){
			return(n);
		}
		n=btree_get_next_node(n);
	}
	
	return(NULL);
}

/*非递归方式,实现增加节点,如果二叉树是空的,新增加的节点为根;如果左子节点为空,左子节点;右子节点*/
int btree_non_recursive_append_child(btree *t,int pid,data *d){
	bnode *p=btree_non_recursive_find_node(t,pid);
	if(t->root!=NULL && p==NULL){
		printf("\n父节点(pid=%d)没有找到!",pid); 
		return(0);
	}
	
	if(p!=NULL && p->left!=NULL && p->right!=NULL){
		printf("\n左右子节点已满,不能增加!");
		return(0);		
	}
	
	bnode *n=(bnode *)malloc(sizeof(bnode));
	n->d=d;
	n->parent=NULL;
	n->left=NULL;
	n->right=NULL;
	
	if(t->root==NULL){
		t->root=n;
	} else{
		n->parent=p;
		if(p->left==NULL){
			p->left=n;
		}else{
			p->right=n;
		}
	} 
	
	return(-1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值