判断二叉树相似和二叉树的遍历

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef char Element;
typedef struct BiNode{
	Element data;
	struct BiNode *lchild, *rchild;
}BiNode,*BiTree;
void create_tree(BiTree &T){ // 参数取地址不用返回值
	T = (BiTree)malloc(sizeof(BiNode));
	cin >> T->data;
	if (T->data == '#'){
		T = NULL;
		return ;
	}
	create_tree(T->lchild);
	create_tree(T->rchild);
	
}
int judge_TreeSimilarity(BiTree T1, BiTree T2){ //判定二叉树是否相似
	int left, right;
	if (T1 == NULL && T2 == NULL){
		return 1;
	}
	else if(T1 ==NULL || T2 ==NULL){//T1HE
		return 0;
	}
	left = judge_TreeSimilarity(T1->lchild, T2->lchild);
	right = judge_TreeSimilarity(T1->rchild, T2->rchild);
	return left && right;	
}
void precede_Tree(BiTree T){//二叉树前序遍历
	if (T != NULL){
		printf_s("%c", T->data);
		precede_Tree(T->lchild);
		precede_Tree(T->rchild);
	}
}
int main(){
	BiTree T1;
	BiTree T2;
	int result;
	printf_s("创建二叉树1:");
	create_tree(T1);
	printf_s("创建二叉树2:");
	create_tree(T2);
	printf_s("二叉树1前序遍历结果:");
	precede_Tree(T1);
	printf("\n");
	result = judge_TreeSimilarity(T1, T2);
	switch (result)
	{
	case 0:
		printf_s("二叉树1 和 二叉树2 不是相似二叉树");
		break;
	case 1:
		printf_s("二叉树1 和 二叉树2 是相似二叉树");
		break;
	}
	system("pause");
	return 0; 
}

 运行结果:

 本人用VS2013编写由于输入输出没加代码所以printf时需要_S.

判断二叉树相似时思想:

①判断两颗二叉树是否都为空,如果都为空时则为相似二叉树

②判断两颗二叉树是否不同时为空,如果不同时为空则不是相似二叉树

③两颗树都不为空时,利用递归的思想判断两棵树的左子树和右子树是否为相似二叉树

猜你喜欢

转载自blog.csdn.net/weixin_42070473/article/details/94359938