首页 > 试题广场 >

假设树的节点的data类型为int型,请实现两棵树是否相等的

[问答题]
假设树的节点的data类型为int型,请实现两棵树是否相等的比较?
 注:A,B两棵树相等且当rootA->data==rootB->data,而且A和B的左右子树相等或者左右互换后相等。
 (1)给出树节点的结构定义 
(2)写出实现思路,以及复杂度估计 
(3)用你习惯的语言或者伪代码实现该算法
推荐

typedef struct TreeNode{

         int c;

         TreeNode *leftchild;

       TreeNode *rightchild;

}TreeNode;
思路是:
   如果两棵树同时为空,则它们相等
   如果同时不为空,则如果他们的左子树与右子树分别相等,或者左子树等于右子树,右子树等于左子树则也算相等,否则返回不相等。
int CompTree(TreeNode* tree1,TreeNode* tree2)

{

         if(tree1 == NULL && tree2 == NULL)

                   return 1;

 

         if(tree1 != NULL && tree2 != NULL)

         {

                   if(tree1->c == tree2->c)

                   {

                            if(CompTree(tree1->leftchild, tree2->leftchild) &&

                                     CompTree(tree1->rightchild, tree2->rightchild) ||

                                     CompTree(tree1->rightchild, tree2->leftchild) &&

                                     CompTree(tree1->leftchild, tree2->rightchild))

                            {

                                     return 1;

                            }

                   }

         }

 

         return 0;

}
时间复杂度,O(LOGN)  N是节点个数

编辑于 2017-05-24 13:55:32 回复(2)
public  class Test {
	private static boolean flag = true;

	public static void main(String [] args){
		//根据输入参数构建树
		//comparePre(root1, root2);

		System.out.println(flag);
	}

	public static void comparePre(Node root1, Node root2){
		if(root1.data != root2.data){
			flag = false;
			return;
		}
		compare(root1, root2);
	}

	public static void compare(Node n1, Node n2){
		if(!flag)
			return;
		if(nodeEqual(n1.left, n2.left) &&nodeEqual(n1.right, n2.right)){
			if(n1.left != null)
				compare(n1.left, n2.left);
			if(n1.right != null)
				compare(n1.right, n2.right);
		} else if(nodeEqual(n1.left, n2.right) && nodeEqual(n1.right, n2.left)){
			if(n1.left != null)
				compare(n1.left, n2.right);
			if(n1.right != null)
				compare(n1.right, n2.left);
		} else {
			flag = false;
		}
	}
	
	public static boolean nodeEqual(Node n1, Node n2){
		if(n1 == n2)
			return true;
		if(n1 != null && n2 != null){
			if(n1.equals(n2)){
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
}

class Node{
	int data;
	Node left;
	Node right;
	public Node(int data){
		this.data = data;
	}

	@Override
	public boolean equals(Object node){
		if(node == null)
			return false;
		Node nodeTemp = (Node) node;
		if(nodeTemp.data != data)
			return false;
		return true;
	}
}
编辑于 2017-07-31 11:18:27 回复(0)

发表于 2017-08-04 10:18:32 回复(0)
public class Tree{
    private int data;
    private Tree right;
    private Tree left;
    getter()...
    setter()...
}
递归判断,首先判断树1的左子树是否等于树2的左子树,并且判断树1的右子树是否等于树2的右子树,再交换判断树1的左子树是否等于树2的右子树并且树1的右子树等于树2的左子树
终止条件为: if(root1==null&&root2!=null)return false;
           if(root2==null)returntrue;
          if(root1.val!=root2.val)returnfalse;
时间复杂度O(logn) 空间复杂度O(1)

代码:
public boolean charge(Tree root1,Tree root2){
        if(root1==null&&root2!=null)return false;
        if(root2==null)return true;
        if(root1.getData()!=root2.getData())return false;
        return (charge(root1.getRight(),root2.getRight())&&charge(root1.getLeft(),root2.getLeft()))||(charge(root1.getRight(),root2.getLeft())&&charge(root1.getLeft(),root2.getRight()))
}
如有错误请指出,并未测试!
发表于 2017-08-01 11:36:31 回复(0)