判断一个节点是否在一棵二叉树中
//判断一个节点是否在一棵二叉树中
bool IsInBinaryTreeNode(BinaryTreeNode* root, BinaryTreeNode* Node)
{
bool res = false;
if (root->_data == Node->_data)
res = true;
if (!res)//递归左子树中找
res = IsInBinaryTreeNode(root->_left, Node);
if (!res)//递归右子树中找
res = IsInBinaryTreeNode(root->_right, Node);
return res;
}
判断一颗二叉树是是否是另一颗树的子树。比如tree2是tree1的子树。
如:
判断一棵树tree2是不是另一颗树tree1的子树
第一步在tree1中找tree2的根节点,也就是2。
第一步结束后有两种情况,没找到,直接返回Tree2不是Tree1的子树;找到就进行到第二步
第二步在Tree1中2的左右节点和Tree2中2的左右节点相比较,如Tree1中根节点2的左右节点不2和7,和Tree2中的左右节点3,8不一样。
继续在Tree1中找看是否还有节点2,如果没找到,就返回不是子树。
如果找到就是图上的情况根节点的左边节点2,再和Tree2 中的左右节点进行对比,找到左右节点3,8都相同,则返回Tree2是Tree1的子树 。
//判断一颗二叉树是是否是另一颗树的子树
bool IsSubTree(BinaryTreeNode* root1, BinaryTreeNode* root2)
//判断Tree2的节点是否在Tree1中
{
bool res = false;
if (root1 != NULL && root2 != NULL)
{
if (root1->_data == root2->_data)//Tree2的节点在Tree1中
res = DoesTree1HasTree2(root1,root2);
if (!res)//递归左子树中找
res = IsInBinaryTreeNode(root1->_left, root2);
if (!res)//递归右子树中找
res = IsInBinaryTreeNode(root1->_right, root2);
}
return res;
}
//两颗数的左右节点是否相等
bool DoesTree1HasTree2(BinaryTreeNode* root1, BinaryTreeNode* root2)
{
if (root2 == NULL)//空树是任何树的子树
return true;
if (root1 == NULL)
return false;
if (root1->_data != root2->_data)
return false;
return DoesTree1HasTree2(root1->_left, root2->_left) &&
DoesTree1HasTree2(root1->_right, root2->_right);
}
本文介绍了一种用于判断一棵二叉树是否为另一棵二叉树的子树的有效算法。首先会在主树中查找子树的根节点,若找到则进一步递归比较两树的结构是否完全相同。该算法利用了递归特性,简洁高效。
394

被折叠的 条评论
为什么被折叠?



