您的位置:首页 > 其它

判断一个节点是否在二叉树中,判断tree2是否为tree1的子树

2017-08-01 22:50 483 查看

1、判断一个节点是否在一棵二叉树中。

先判断根节点,递归判断左子树,递归判断右子树。

2、判断一颗二叉树是是否是另一颗树的子树。比如tree2是tree1的子树。



先判断根,根相同再判断左右子树如果所有的都相同,则此树是另一个树的子树。 如果只有根相同,则向下继续找和跟相同的结点。

代码:

#include<iostream>

using namespace std;

struct Node
{
int _data;
Node* _leftchild;
Node* _rightchild;

Node(int x)
:_data(x)
, _leftchild(NULL)
, _rightchild(NULL)
{}
};

class BinaryTree
{
public:
BinaryTree(const int a[], int size, int invalide)
{
int index = 0;
_root = _CreateBinaryTree(a, size, index, invalide);
}

Node* _CreateBinaryTree(const int a[], int size, int &index, int invalide)
{
Node* root = NULL;
if (index < size && a[index] != invalide)
{
root = new Node(a[index]);
root->_leftchild = _CreateBinaryTree(a, size, ++index, invalide);
root->_rightchild = _CreateBinaryTree(a, size, ++index, invalide);
}
return root;
}

//判断一个节点是否在一棵二叉树中。(注意多测几个节点,看是否都能找到)
bool IsInTree(Node* node)
{
return _IsInTree(_root, node);
}

bool _IsInTree(Node* root, Node* node)
{
if (root == NULL)
return false;
if (root == node)
return true;
if (_IsInTree(root->_leftchild, node) || _IsInTree(root->_rightchild, node))
return true;
return false;
}

//判断一颗二叉树是是否是另一颗树的子树。比如tree2是tree1的子树。
bool IsChildTree(Node* pRoot)
{
return _IsChildTree(_root, pRoot);
}

bool __IsChildTree(Node* root, Node* pRoot)
{
if (root == NULL)
return false;
if (pRoot == NULL)
return true;
if (root->_data != pRoot->_data)
return false;
return __IsChildTree(root->_leftchild, pRoot) && __IsChildTree(root->_rightchild, pRoot->_rightchild);
}

bool _IsChildTree(Node* root, Node* pRoot)
{
bool ret = false;
if (root != NULL&&pRoot != NULL)
{
if (root->_data == pRoot->_data)
ret = __IsChildTree(root, pRoot);
if (!ret)
ret = _IsChildTree(root->_leftchild, pRoot);
if (!ret)
ret = _IsChildTree(root->_rightchild, pRoot);
}
return ret;
}

private:
Node* _root;
};
int main()
{
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 递归
相关文章推荐