您的位置:首页 > 编程语言 > C语言/C++

C++二插树和值与子树求解

2015-06-14 17:46 399 查看
#include <iostream>
#include <stack>
using namespace std;

template<typename Type>
struct Node
{
Type data;
Node *left;
Node *right;
Node(Type d = Type()):data(d), left(NULL), right(NULL){}
};
template<typename Type>
class MyTree
{
public:
MyTree(const char *str)
{
root = NULL;
flags = '#';
Init(root, str);
}
void Printf()
{
Printf(root);
}
bool IsSonTree(Type a,Type b)
{
return IsSonTree(GetPtr(a),GetPtr(b));
}
Type GetValue(Type a)
{
return GetPtr(a)->data;
}
Node<Type> * GetPtr(Type a)
{
return GetPtr(root, a);
}
void Sum(int x)//打印和值为x的二叉树。
{
int sum = 0;
stack<Node<Type> *> st;//借助一个栈来实现。
Sum(root, x,sum,st);
}
private:
int Sum(Node<Type> *t,int x,int sum,stack<Node<Type>*> st)//此处不能用引用传递st。
{
if (t == NULL)
{
return 0;
}
if (t)
{
sum += t->data - '0';
st.push(t);
if (sum == x)
{
while (st.empty() == false)
{
Node<Type> *p = st.top();
st.pop();
cout << p->data << " ";
}
cout << endl;
sum = 0;//将sum设置为0,继续递归寻找其他和值等于x的路径。
}
if (sum > x)//如果此路大于x,则直接跳出这条路继续递归。
{
return 0;
}
Sum(t->left, x, sum, st);
Sum(t->right, x, sum, st);
}
}
bool IsSonTree(Node<Type> *t, Node<Type> *p)//判断p树是不是t树的子树。
{
if (t == NULL)return false;
else
{
if (t == p)
return Find(t, p);//每次找到一个节点相等,就进入Find函数进行递归判断看是否所有的节点都相等。
bool BOOL = IsSonTree(t->left, p);
if (BOOL)return BOOL;
return IsSonTree(t->right, p);
}
return false;
}
bool Find(Node<Type> *t, Node<Type> *p)
{
if (t == p)return true;
if (t != NULL)
{
bool BOOL = Find(t->left,p);
if (BOOL)return true;
return Find(t->right, p);
}
return false;
}
Node<Type>* GetPtr(Node<Type> *t,Type a)
{
if (t!=NULL && t->data == a)return t;
if (t)
{
Node<Type> *tmp = GetPtr(t->left, a);
if (tmp)return tmp;
return GetPtr(t->right, a);
}
return NULL;
}
void Printf(Node<Type> *t)
{
if (t != NULL)
{
cout << t->data << " ";
Printf(t->left);
Printf(t->right);
}
}
void Init(Node<Type> *&t, const char *&s)
{
if (*s == flags)
{
t = NULL;
return;
}
else
{
t = new Node<Type>(*s);
Init(t->left,++s);
Init(t->right, ++s);
}
}
private:
Node<Type> *root;
Type flags;
};

int main()
{
MyTree<char> mt("123##4##51##7##");
mt.Sum(7);//求和值为定值的所有路径。
//mt.Printf();
//cout << endl;
//cout << mt.IsSonTree('1','7') << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: