剑指offer 面试题18 树的子结构

E:\arithmetic\SubTree

思路:分两部分判断,先判断根节点的值是否一样,一样的话判断子节点是否也一致

#include <stdio.h>
#define END (-2000)
typedef struct BinaryTreeNode{
	int value;
	struct BinaryTreeNode *lChild;
	struct BinaryTreeNode *rChild;
}TreeNode;

TreeNode* insertNodePre(int arr[], int *i);
void preOrder(TreeNode *r);
int findSub(TreeNode* root, TreeNode *sub);
 
int main(int argc, char *argv[])
{ 
	int arr[] = {8, 8, 9, END, END, 2, 4, END, END, 7, END, END, 7, END, END};
	int i = 0;
	TreeNode *root = insertNodePre(arr, &i);
	preOrder(root);
	printf("\n");
	
	int arr2[] = {8, 9, END, END, 2, END, END};
	i = 0;
	TreeNode *sub = insertNodePre(arr2, &i);
	preOrder(sub);
	printf("\n");
	
	int arr3[] = {2, 4, END, END, 7, END, 9, END, END};
	i = 0;
	TreeNode *sub2 = insertNodePre(arr3, &i);
	preOrder(sub2);
	printf("\n");
	
	int flag = findSub(root, sub2);
	printf("%d\n", flag);
	return 0;
}

int findSub(TreeNode* root, TreeNode *sub){//找到是1 没找到是0 
	if(root != NULL)
		printf("findSub\t%d\n", root->value);
	else
		printf("findSub\tNULL\n" );
	if( (root == NULL) || (sub == NULL)){
		return 0;
	}
	int flag = 0;
	if(root->value == sub->value){
		 flag = subOK(root, sub);
	}
	if(flag)
		return flag;
		
	flag = findSub(root->lChild, sub);
	if(flag)
		return flag;
		
	flag = findSub(root->rChild, sub);
	
	return flag;
	
}
int subOK(TreeNode *root, TreeNode *sub){
	if(root != NULL)
		printf("subOK\t%d\n", root->value);
	else
		printf("subOK\tNULL\n" );
	if( (root == NULL) )//!!!不能跟子树一起判断是否为NULL,因为是包含关系,而不是绝对相等,可能的一种情况是root树有孩子而子树没有了,就不用判断了。 
		return 0;
	if(sub == NULL)//!!!
		return 1;
		
	int flag = 1;
	if(root->value != sub->value)
		return 0;
	if(sub->lChild != NULL)//注意:是拿子树的子节点判断 
		flag = subOK(root->lChild, sub->lChild);
	if(flag && sub->rChild != NULL)
		flag = subOK(root->rChild, sub->rChild);
	return flag;
		
	
		
}
//前序遍历构建二叉树,输入数组前, 要先将所有的叶子节点进行扩展,保证所有的叶子节点都为NULL 
TreeNode* insertNodePre(int arr[], int *i){
	
	int k = *i;//!!!直接用arr[*i]不对 
	
	if(arr[k] == END){
		k++;
		*i = k;
		return NULL;
	}
	int j;
	TreeNode *t = malloc(sizeof(TreeNode));

	t->value = arr[k];
	
	k++;
	*i = k;
	
	t->lChild = insertNodePre(arr, i);	
	t->rChild = insertNodePre(arr, i);
	
	return t;
	 
	
	
	
} 

void preOrder(TreeNode *r){
	if(r == NULL){
		return;
	}
	printf("%d\t", r->value);
	preOrder(r->lChild);
	preOrder(r->rChild);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值