(一)求二叉树和为某一值的路径
//二叉树中和为某一值的路径44
void findpath(BstNode* ptr,int sum,int& cur,vector<BstNode*> &vec)
{
cur += ptr->data;
vec.push_back(ptr);
//如果当前节点为叶子节点并且cur == sum 满足要求 打印vector中的节点
if(ptr->leftchild == NULL && ptr->rightchild == NULL && cur == sum)
{
cout<<"二叉树中和为"<<sum<<"的路径为::";
vector<BstNode*>::iterator it = vec.begin();
while(it != vec.end())
{
cout<<(*it)->data<<" ";
++it;
}
cout<<endl;
}
//如果当前节点有左孩子 那么继续判断左孩子
if(ptr->leftchild != NULL)
findpath(ptr->leftchild,sum,cur,vec);
//如果当前节点有右孩子 那么继续判断右孩子
if(ptr->rightchild != NULL)
findpath(ptr->rightchild,sum,cur,vec);
//如果当前节点为叶子节点 但是 cur!=num 那么回退到上一层 并且cur减去当前节点值
//vector中删除此节点
cur -= ptr->data;
vec.pop_back();
}
void Find_Path(BstNode* ptr,int sum)
{
if(ptr == NULL)
return ;
int cur = 0;//用来标记所经过的节点到当前节点的和
vector<BstNode*> vec;//记录经过的路径
findpath(ptr,sum,cur,vec);
}
(二)判断一个数组是否为搜索二叉树的后序遍历
//判断一个数组是否是二叉搜索树的后序遍历
bool Is_LastOrder( ElemType *arr,int len)
{
if(arr == NULL || len < 0)
return false;
//最后一个元素为根节点
ElemType root = arr[len -1];
int i = 0;
//从头遍历找第一个比root节点大的值 确定根节点的左节点范围
for( ;i < len-1 ;++i)
{
if(arr[i] > root)
{
break;
}
}
//在根节点右边如果有存在小于根节点的值 那么就不是二叉搜索树
for(int j = i ;j < len -1 ;++j)
{
if(arr[j] < root)
return false;
}
//经过前两个循环后 第一次左右划分正确 在判断左右孩子是否为二叉搜索树
bool left = true;
if(i > 0)
left = Is_LastOrder(arr,i);
bool right = true;
if(i < len -1)
right = Is_LastOrder(arr+i,len - i -1);
//只有都比较完之后 left 和right 都为真时 才真的是二叉搜索树的后序遍历
return (left && right);
}