题目27分析:(二叉树的镜像)
前序遍历二叉树的每个节点,若节点有左右子节点,则交换其左右子节点,然后继续递归遍历其左右子节点;若节点没有左右子节点,则此节点不需交换。
思路:
1.如果根节点或者节点的左右子节点不为空,则交换两个子节点
2.如果当前节点的左子节点存在,递归遍历左子节点
3.如果当前节点的右子节点存在,递归遍历右子节点
4.直至当前遍历节点的左右子节点为空,则停止遍历当前节点
#include <iostream> #include <string> using namespace std; struct BTNode { int data; BTNode *lchild, *rchild; }; BTNode *create_tree(int level, string pos) { int data; cout << "输入第 " << level << " 层的 " << pos << endl; cin >> data; if (data == 0) return NULL; BTNode *node = new BTNode; node->data = data; node->lchild = create_tree(level + 1, "lchild"); node->rchild = create_tree(level + 1, "rchild"); return node; } void pre_order(BTNode *tree) { if (tree) { cout << tree->data << " "; pre_order(tree->lchild); pre_order(tree->rchild); } } void mirror_binary_tree(BTNode *node) { if (node == NULL) return; //4.直至当前遍历节点的左右子节点为空,则停止遍历当前节点 if (node->lchild == NULL&&node->rchild == NULL) return; //1.如果根节点或者节点的左右子节点不为空,则交换两个子节点 BTNode *temp_node = node->lchild; node->lchild = node->rchild; node->rchild = temp_node; //2.如果当前节点的左子节点存在,递归遍历左子节点 if (node->lchild) mirror_binary_tree(node->lchild); //3.如果当前节点的右子节点存在,递归遍历右子节点 if(node->rchild) mirror_binary_tree(node->rchild); } void main() { BTNode *tree = create_tree(1, "root"); pre_order(tree); cout << endl; mirror_binary_tree(tree); pre_order(tree); }
题目28分析:(对称的二叉树)
前序遍历算法是先遍历父节点,再遍历左子节点,最后遍历右子节点;设计一种对称前序遍历算法,先遍历父节点,再遍历右子节点,最后遍历左子节点。若同时遍历时,两种遍历方式的所有节点对应值相同时,则是对称二叉树。
思路:
1.首先判断如果两种遍历方式的当前节点同时为空,则对称,返回true
2.然后判断如果两种遍历方式的当前节点一个为空,则不对称,返回false
3.如果两种遍历方式的当前节点得值不相同时,则不对称,返回false
4.继续递归判断当前节点的左右子节点,第一种遍历方式是先左再右,第二种遍历方式是先右再左
#include <iostream> #include <string> using namespace std; struct BTNode { int data; BTNode *lchild, *rchild; }; BTNode *create_tree(int level, string pos) { int data; cout << "输入第 " << level << " 层的 " << pos << endl; cin >> data; if (data == 0) return NULL; BTNode *node = new BTNode; node->data = data; node->lchild = create_tree(level + 1, "lchild"); node->rchild = create_tree(level + 1, "rchild"); return node; } void pre_order(BTNode *tree) { if (tree) { cout << tree->data << " "; pre_order(tree->lchild); pre_order(tree->rchild); } } bool is_symmetry(BTNode *root_1, BTNode *root_2) { //1.首先判断如果两种遍历方式的当前节点同时为空,则对称,返回true if (root_1 == NULL&&root_2 == NULL) return true; //2.然后判断如果两种遍历方式的当前节点一个为空,则不对称,返回false if (root_1 == NULL || root_2 == NULL) return false; //3.如果两种遍历方式的当前节点得值不相同时,则不对称,返回false if (root_1->data != root_2->data) return false; //4.继续递归判断当前节点的左右子节点,第一种遍历方式是先左再右,第二种遍历方式是先右再左 return is_symmetry(root_1->lchild, root_2->rchild) && is_symmetry(root_1->rchild, root_2->lchild); } void main() { BTNode *tree = create_tree(1, "root"); pre_order(tree); cout << endl; if (is_symmetry(tree, tree)) cout << "是对称二叉树" << endl; }