问题一:查找二叉树是否有满足和值的路径。
思路:从根结点开始,若结点为空以及sum==0,则成功,否则sum->sum - node->data,判断左子树和右子树是否有和值为sum的路径。
代码:
bool havePathSum(BinTree T,int sum)
{
if(T == NULL){
return (sum == 0);
}
else{
int subSum = sum - T->data;
return (havePathSum(T->lchild,subSum) ||
havePathSum(T->rchild,subSum));
}
}
测试:
A
C B
F E D
Have path sum = 199 : true
Have path sum = 198 : false
修改上述函数用以显示路径:
bool havePathSum(BinTree T,int path[],int pathLen,int sum)
{
if(T == NULL){
return (sum == 0);
}
else{
path[pathLen++] = T->data;
int subSum = sum - T->data;
if (havePathSum(T->lchild,path,pathLen,subSum) ||
havePathSum(T->rchild,path,pathLen,subSum))
{
if(T->lchild == NULL && T->rchild == NULL){
for (int i = 0; i < pathLen; i++)
cout<<setw(3)<<char(path[i]);
}
return true;
}
else
return false;
}
}
测试结果:
A
C B
F E D
Rout: A B D
Have path sum = 199 : true
问题二:判断二叉树是否平衡二叉树。
思路:检查二叉树左右子树的高度差是否不大于1,若不满足返回false,否则将参数该为左右子树的根结点,检查两个子树是否满足平衡条件。
代码:
bool isBalanced(BinTree T)
{
if(T)
{
if(abs(Height(T->lchild) - Height(T->rchild)) <= 1)
return (isBalanced(T->lchild) && isBalanced(T->rchild));
else
return false;
}
return true;
}
测试结果:
A
C B
F E D
Tree Balanced? : true
A
C B
D
E
Tree Balanced? : false
REF:
1,http://cslibrary.stanford.edu/110/BinaryTrees.html#csoln