赞
踩
简单的递归算法可以对应线性的循环体,乃至多重循环。但在二叉树这一非线性数据结构上,则更加深刻的体现了纯递归应用的广泛性。
1.递归解决二叉树问题的方法总纲
结合压栈特性分类讨论与结点处理
2.压栈特性
许多问题需要压栈(叶子结点),故而先递归,再等返回后处理
3.结点处理
二叉树数据结构的根左右递归特性决定了我们一次只处理一个根左右抽象结点问题。
4.分类讨论(递归处理/递归结束)
一般情况下有这样几种方式:
(1).根空,根非空
eg:最简单的例子非属二叉树的遍历,在递归序的基础上(压栈特性)产生了前中后三种遍历方式,而我们的分类就是当前结点(根结点)是否为空,非空需要处理,空不处理。
void InorderTraversal(BinTree T)
{
if(T)
{
InorderTraversal(T->Left);
printf("%d",T->Data);
InorderTraversal(T->Right);
}
}
(2).根空,根非空左右空,左空右非空,左非空右空,左右非空(例子为是否二叉搜索树)
bool Is_BST(BinTree T, int* min, int* max) { if(!T) return true; //根空 if(T->Left==NULL&&T->Right==NULL) //根非空左右空 { *min = *max = T->Data; return true; } if(T->Left&&T->Right==NULL) //左非空右空 { if(Is_BST(T->Left, min,max)&&T->Data>*max) { *max = T->Data; return true; } else return false; } if(T->Left==NULL&&T->Right) //左空右非空 { if(Is_BST(T->Right, min,max)&&T->Data<*min) { *min = T->Data; return true; } else return false; } if(T->Left&&T->Right) //左右非空 { return (Is_BST(T->Left, min,max)&&T->Data>*max&&Is_BST(T->Right,min,max)&&T->Data<*min); } } bool IsBST(BinTree T) { int max=-1, min=-1; if(Is_BST(T,&min,&max)) return true; else return false; }
(3).根结点是吗(如二叉搜索树),左子树是吗,右子树是吗
bool Is_BST(BinTree T,int *min, int *max) { int lmin, lmax, rmin, rmax; if(!T) return true; if(!T->Left&&!T->Right) { *min = *max = T->Data; return true; } //根结点是吗 bool Left_flag = false; bool Right_flag = false; if((T->Left&&Is_BST(T->Left,&lmin, &lmax)&&T->Data>lmax)||!T->Left) Left_flag = true; //左子树是吗 if((T->Right&&Is_BST(T->Right,&rmin,&rmax)&&T->Data<rmin)||!T->Right) Right_flag = true; //右子树是吗 if(Left_flag&&Right_flag) { if(T->Left) *min = lmin; else *min = T->Data; if(T->Right) *max = rmax; else *max = T->Data; return true; } else return false; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。