27(二叉树的镜像)、28(对称的二叉树)

题目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;
}

猜你喜欢

转载自blog.csdn.net/attitude_yu/article/details/80653720