百度笔试题:判断一个二叉树是否是另一颗二叉树的子树

来源:互联网 发布:淘宝快递包邮的秘密 编辑:程序博客网 时间:2024/05/19 02:02

是返回1,否则返回-1

给出了函数体

int IsSubTree(BiTree* root1, BiTree* root2)//判断root2是否是root1的子树

{

//写自己的代码

}


思想:首先找到root1中和root2根节点相等的节点,再从该节点开始比较是否每个节点都相等

#include<iostream>using namespace std;typedef struct BiTree{int value;BiTree *left, *right;}BiNode, *MyBiTree;void createBiTree(MyBiTree &T){int data;cin >> data;if (-1 == data)//输入结束标志T = NULL;else{T = new BiNode;//分配新的内存T->value = data;//输入的值赋值给数的节点值createBiTree(T->left);//递归创建左子树createBiTree(T->right);//递归创建右子树}}void deleteBiTree(MyBiTree &T){if (T != NULL)//树不为空就递归删除左子树,递归删除右子树,再最后释放根节点内存{deleteBiTree(T->left);deleteBiTree(T->right);delete T;}}int IsSubTreeSameRootValue(BiTree *root1,BiTree *root2)//两棵树的起始节点的值已经相等,在判断其他节点是否相等{if (NULL == root2)return 1;if (NULL == root1)return -1;if (root1->value != root2->value)return -1;int i = IsSubTreeSameRootValue(root1->left, root2->left);//根节点已经相等,判断左孩子int j = IsSubTreeSameRootValue(root1->right, root2->right);//根节点已经相等,判断右孩子if (1 == i && 1 == j)//如果左右孩子都相等,则是子树,否则不是return 1;elsereturn -1;}int IsSubTree(BiTree* root1, BiTree* root2)//判断root2是否是root1的子树{if (NULL == root2)//空树是任何树的子树return 1;if (NULL == root1)//如果root2不为空,而root1为空,则不是return -1;if (root1->value == root2->value)//如果两个树都不为空,且根节点值相等return IsSubTreeSameRootValue(root1, root2);//从相等的节点开始判断是否是子树int i = IsSubTree(root1->left, root2);//如果节点值不相等,看root1的左子树是中是否含有该子树if (1 == i)return 1;elsereturn IsSubTree(root1->right, root2);//如果节点值不等,并且左子树中没有该子树,再看其右子树中是否含有该子树}int main(){MyBiTree root1, root2;createBiTree(root1);createBiTree(root2);cout<<IsSubTree(root1, root2);delete(root1);delete(root2);system("pause");return 0;}


0 0
原创粉丝点击