[LeetCode]100.Same Tree

【题目】

Same Tree

  Total Accepted: 4943  Total Submissions: 11464 My Submissions

Given two binary trees, write a function to check if they are equal or not.

Two binary trees are considered equal if they are structurally identical and the nodes have the same value.


【代码】

【递归】

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode *p, TreeNode *q){
        //同时到达叶子节点,终止
        if(p == NULL && q == NULL){
            return true;
        }
        //不同时到达叶子节点,剪枝
        if(p == NULL || q == NULL){
            return false;
        }
        if(p->val == q->val){
            bool left = isSameTree(p->left,q->left);
            bool right = isSameTree(p->right,q->right);
            return left && right;
        }
        else{
            return false;
        }
    }
};

【迭代】
/*********************************
*   日期:2013-12-08
*   作者:SJF0115
*   题目: 100.Same Tree
*   来源:http://oj.leetcode.com/problems/same-tree/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode *p, TreeNode *q){
        stack<TreeNode *> stack;
        stack.push(p);
        stack.push(q);
        //迭代
        while(!stack.empty()){
            //获取节点
            q = stack.top();
            stack.pop();
            p = stack.top();
            stack.pop();
            //终止,q,p都没有左右节点
            if(p == NULL && q == NULL){
                continue;
            }
            //剪枝,有且只有一个没有左右节点,
            if(p == NULL || q == NULL){
                return false;
            }
            //剪枝,节点值不一样
            if(p->val != q->val){
                return false;
            }
            //遍历左右子节点
            stack.push(p->left);
            stack.push(q->left);
            stack.push(p->right);
            stack.push(q->right);
        }
        return true;
    }
};


【测试】

/*********************************
*   日期:2013-12-08
*   作者:SJF0115
*   题目: 100.Same Tree
*   来源:http://oj.leetcode.com/problems/same-tree/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <malloc.h>
#include <queue>
#include <stdio.h>
using namespace std;

typedef struct TreeNode{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}TreeNode,*BiTree;

//按先序序列创建二叉树
int CreateBiTree(BiTree &T){
	int data;
	//按先序次序输入二叉树中结点的值,‘-1’表示空树
	scanf("%d",&data);
	if(data == -1){
		T = NULL;
	}
	else{
		T = (BiTree)malloc(sizeof(TreeNode));
		//生成根结点
		T->val = data;
		//构造左子树
		CreateBiTree(T->left);
		//构造右子树
		CreateBiTree(T->right);
	}
	return 0;
}
bool isSameTree(TreeNode *p, TreeNode *q){
    //同时到达叶子节点,终止
    if(p == NULL && q == NULL){
        return true;
    }
    //不同时到达叶子节点,剪枝
    if(p == NULL || q == NULL){
        return false;
    }
    if(p->val == q->val){
        bool left = isSameTree(p->left,q->left);
        bool right = isSameTree(p->right,q->right);
        return left && right;
    }
    else{
        return false;
    }
}

int main() {
    int i,n;
    BiTree root1,root2= NULL;
    CreateBiTree(root1);
    CreateBiTree(root2);
    printf("%d\n",isSameTree(root1,root2));
    return 0;
}


你可能感兴趣的:(LeetCode,面试,校园招聘,剑指offer)