更新一下非递归方式对二叉树的部分函数,关键是如何实现非递归前序遍历。
#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);
}