树的模板

想总结一点树的模板
首先是二叉树的节点定义

typedef struct node {
	int data;
	struct *lchild, *rchild;
}*Btree, btree; 

前序遍历

递归算法
void PREORDER(Btree T) {
	if(T) {
		visit(T);
		PREORDER(T->lchild);
		PREORDER(T->rchild);
	}
} 
迭代算法一
// 前序遍历 --- 非递归算法一 
void PREORDER(Btree T) {
	Btree Stack[N], p = T;
	int top = -1;
	if(T) {
		Stack[++top] = p;
		do {
			p = Stack[top--];
			visit(p);
			if(p->rchild)                 //先将右子树入栈 
				Stack[++top] = p->lchild;
			if(p->lchild)                 //再将左子树入栈 
				Stack[++top] = p->rchild;
		}while(top != -1);
	}
}
迭代算法二

根据邓俊辉老师的思想写的

// 前序遍历 --- 非递归算法二 (左侧链)
//第一步:自上而下访问左侧链
void visit_left_branch(Btree T, Btree Stack[], int *top) {
	while(T) {
		visit(T);
		Stack[++*top] = T->rchild;  //直接将节点推入,空节点也无所谓 
		T = T->lchild;
	}
}
//第二步:自下而上访问右子树 
void PREORDER(Btree T) {
	Btree Stack[N], p = T;
	int top = -1;
	while(1) {
		visit_left_branch(T, Stack, &top);
		if(top == -1) break;
		T = Stack[top--];
	}
} 

中序遍历

递归算法
//中序遍历 ---递归算法 inorder
void INORDER(BTree T) {
	if(T) {
		INORDER(T->lchild);
		visit(T);
		INORDER(T->rchild);
	}
} 
迭代算法一
//中序遍历 ---非递归算法一 
#define N 100
void INORDER(Btree T) {
	//T为二叉树根节点所在地址
	Btree STACK[N], p = T; // 设置一个栈来保存节点 
	int top = -1;
	if(T) {
		do {
			while(p) {
				STACK[++top] = p;
				p = p->lchild;
			}
			p = STACK[top--];
			visit(p);
			p = p->rchild;
		} while(p != NULL || top != -1));
	} 
} 
迭代算法二

根据邓俊辉老师的MOOC写的

//非递归算法二
/*
  第一步:访问左侧链的末端 
  第二步:访问右子树
  第三步:控制权回到上层节点
  循环 
*/ 
void go_along_left_branch(Btree T, Btree Stack[], int *top) {
	while(T) {
		Stack[++*top] = T;
		T = T->lchild;
	}
} 
void inorder(Btree T) {
	Btree Stack[N];
	int top = -1;
	while(1) {
		go_along_left_branch(T, Stack, &top);
		if(top == -1) break;
		T = Stack[top--];
		visit(T);
		T = T->rchild;
	}
}

后序遍历

递归算法
void POSTORDER(Btree T) {
	if(T) {
		POSTORDER(T->lchild);
		POSTORDER(T->rchild);
		visit(T);
	}
} 
迭代算法
//后续遍历 --- 非递归算法
void POSTORDER(Btree T) {
	Btree Stack1[N], p = T; // 设置一个栈保存节点 
	int Stack2[N], top = -1, flag; // 设置栈和flag用来区分是否读取 
	if(T) {
		do {
			while(p) {
				Stack1[++top] = p;
				Stack2[top] = 0;
				p = p->lchild;
			}
			p = Stack1[top];
			flag = Stack2[top--];
			if(flag == 0) {
				Stack1[++top] = p;
				Stack2[top] = 1;
				p = p->rchild; 
			}
			else {
				visit(p);
				p = NULL;
			}
		}while(p || top != -1);
	}
}

层次遍历

//层次遍历
void LAYEORDER(Btree T) {
	Btree Queue[N], p = T;
	int front, rear;
	if(T) {
		Queue[0] = T;
		front = -1;
		rear = 0;
		while(front < rear) {
			p = Queue[++front];
			visit(p);
			if(p->lchild) Queue[++rear] = p->lchild;
			if(p->rchild) Queue[++rear] = p->rchild;
		}
	}
}

重构

要完成重构二叉树,必须==[先序 | 后序] + 中序==
只有先序和后序,不一定能够还原二叉树,除非这个二叉树是一个真二叉树(每个节点的度都为偶数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值