思路:
1.在原数中进行遍历每个节点,查看该节点值是否和给定子树节点值相同,若相同则比较比较子结构
1)若子结构相同,则返回
2)若子结构不相同,则继续比较原树中根节点和给定子树根节点值。
2.遍历直到整个原树中所有节点都被遍历过,或者找到给定子树的子结构
//思路: //1.在原数中进行遍历每个节点,查看该节点值是否和给定子树节点值相同,若相同则比较比较子结构 // 1)若子结构相同,则返回 // 2)若子结构不相同,则继续比较原树中根节点和给定子树根节点值。 //2.遍历直到整个原树中所有节点都被遍历过,或者找到给定子树的子结构 #include <iostream> using namespace std; int preOrder[] = {10, 6, 4, 8, 14, 12, 16}; int inOrder[] = {4, 6, 8, 10, 12, 14, 16}; int preOrder1[] = {6, 4, 18}; int inOrder1[] = {4, 6, 18}; typedef struct Node_ { int data; Node_ * left; Node_ * right; }Node; //利用先序遍历结果和中序遍历结果重建二叉树 void rebuildTree(Node *& root, int preOrder[], int inOrder[], int pl, int pr, int il,int ir) { int i, k; for (i = il; i <= ir; ++i) { if (preOrder[pl] == inOrder[i]) { break; } } k = i - il; if (i <= ir) { root = new Node(); root->data = preOrder[pl]; root->left = 0; root->right = 0; } else { root = 0; return ; } rebuildTree(root->left, preOrder, inOrder, pl + 1, pl + k , il, i -1); rebuildTree(root->right, preOrder, inOrder, pl + k +1, pr, i + 1, ir); return ; } //中序遍历二叉树 void RecurionInOrder(Node * root) { if (!root) { return; } RecurionInOrder(root->left); printf("%d ", root->data); RecurionInOrder(root->right); } //比较2棵树是否相同 int MatchTree(Node * root, Node * child) { if (!child) { return 1; } if (!root) { return 0; } if (root->data != child->data) { return 0; } return MatchTree(root->left, child->left) && MatchTree(root->right, child->right); } //判断原树中那个节点与子树的根节点相同,若相同则判断当前节点子树结构是否与给定子树节点值相同 int IsSubTree(Node * root, Node * child) { if (!child) { return 0; } int res = 0; if (root && child) { if (root->data == root->data) { res = MatchTree(root, child); } if (!res) { res = MatchTree(root->left, child); } else { return res; } if (!res) { res = MatchTree(root->right, child); } else { return res; } } return res; } int main() { Node * root1 = 0; Node * root2 = 0; int n = sizeof(preOrder) / sizeof(preOrder[0]); //重建树1 rebuildTree(root1, preOrder, inOrder, 0, n - 1, 0, n - 1); RecurionInOrder(root1); printf("\n"); //重建树2 rebuildTree(root2, preOrder1, inOrder1, 0, n - 1, 0, n - 1); RecurionInOrder(root2); printf("\n"); //中序遍历树 int res = IsSubTree(root1, root2); printf("%s\n", res == 1?"YES":"NO"); return 0; }