数据结构---二叉树(2)

1.树的子结构(剑指offer-18)

题目:输入两棵二叉树A和B,判断B是不是A的子结构。

解析:要查找树A中是否存在和树B结构一样的子树,可以分成两步:

第一步在树A中找到和B的根节点的值一样的结点R;

第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构。

第一步在树A中查找与根结点的值一样的结点,这实际上就是树的遍历。递归调用HasSubTree遍历二叉树A。如果发现某一结点的值和树B的头结点的值相同,则调用DoesTreeHavaTree2,做第二步判断。第二步是判断树A中以R为根结点的子树是不是和树B具有相同的结构。

	// 输入两棵二叉树A和B,判断B是不是A的子结构
	public static boolean hasSubTree(Node T1, Node T2) {

		boolean result = false;

		if (T1 != null && T2 != null) {
			if (T1.value == T2.value)
				result = DoesTree1HaveTree2(T1, T2);
			if (!result)
				result = hasSubTree(T1.leftChild, T2);
			if (!result)
				result = hasSubTree(T1.rightChild, T2);
		}

		return result;
	}

	private static boolean DoesTree1HaveTree2(Node T1, Node T2) {

		if (T2 == null)
			return true;

		if (T1 == null)
			return false;

		if (T1.value != T2.value)
			return false;

		return DoesTree1HaveTree2(T1.leftChild, T2.leftChild)
				&& DoesTree1HaveTree2(T1.rightChild, T2.rightChild);

	}


2.二叉树的镜像(剑指Offer-19)

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。

解析:先序遍历树的每个结点,若遍历到的结点有子节点,则交换它的两个结点。


	//二叉树的镜像
	public static void MirroRecursively(Node pNode)  
	{  
	    if(null == pNode||(null == pNode.leftChild && null == pNode.rightChild))  
	        return;  
	    
	    Node pTemp = pNode.leftChild;  
	    pNode.leftChild = pNode.rightChild;  
	    pNode.rightChild = pTemp;  
	      
	    if(pNode.leftChild!=null)  
	        MirroRecursively(pNode.leftChild);  
	    if(pNode.rightChild!=null)  
	        MirroRecursively(pNode.rightChild);  
	}  

3.二叉搜索树的后序遍历序列(判断后序遍历序列是否合法)

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。

解析:在后序遍历得到的序列中,最后一个数字是树的根结点的值,数组中前面的数字可分为两个部分:第一部分是左子树结点的值,它们都比根结点的值小,第二部分是右子树结点的值,它们都比根结点的值大。

根据上述性质,所以我们可以写一个递归函数:

1.递归的终止条件是当前树的结点总数为0

2.判断是否是二叉排序树的方法:首先,找到第一个大于根结点的结点位置,将数组分为两部分,判断右子树中的全部结点是否均大于根结点的值

	// start--arr开始位置 0
	// end--arr结束位置 arr.length-1
	public static boolean VerifySequenceOfBST(int arr[], int start, int end) {
		if (arr == null || start < 0 || start > end || end < 0) {
			return false;
		}

		int root = arr[end];

		// 在二叉搜索树中左子树的结点小于根结点
		int i = start;
		for (; i < end; i++)
		{
			if (arr[i] > root) {
				break;
			}
		}

		// 在二叉搜索树中右子树的结点大于根结点
		int j = i;
		for (; j < end; j++)
		{
			if (arr[j] < root)// 右子树居然有比根小的
			{
				return false;
			}
		}

		boolean left = true;
		if (i > start)// 存在左子树
		{
			left = VerifySequenceOfBST(arr, start, i-1);
		}

		boolean right = true;
		if (i < end)// 存在右子树
		{
			right = VerifySequenceOfBST(arr, i, end - 1);
		}
		return left && right;
	}

后续:数据结构---二叉树(3)



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值