码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-06-15 09:38:26      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:二叉树和值为定值路径   判断是否是子树   

#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;
}

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

标签:二叉树和值为定值路径   判断是否是子树   

原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/46492581

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!