[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;
}


目录
相关文章
|
Java
Leetcode 114. Flatten Binary Tree to Linked List
思路也很简单,先把root的左子树(如有)变成单链表 leftlinkedlist,把root的右子树(如有)变成单链表 rightlinkedlist,再把root的右节点变成leftlikedlist,再把rightlinkedlist接到leftlinkedlist后面,代码如下。
111 1
Leetcode Minimum Depth of Binary Tree (面试题推荐)
计算树的最小深度 很简单的一道题,只需要遍历一次树,到叶子节点的时候计算一下深度和当前最小深度比较,保存最小值就行。 我在这用了一个全局变量 mindepth。总感觉我这代码写的不够简练,求更精简的方法。
119 0
Leetcode Binary Tree Postorder Traversal(面试题推荐)
非递后续归遍历二叉树,肯定得用到栈。先序遍历很好写,但后续遍历就不是那么容易了。 只需要设置个指针pre,指向最后输出的那个节点就行了,只要判断cur指针指向的是上次输出节点的父节点,且cur无其他未遍历的节点,这个时候就把cur节点输出即可,然后更改pre。原理是要遍历当前节点,其所有子节点都必须遍历完,因为肯定是先左后右,所以只需一个指针保持前一次输出的结果即可。
105 0
Leetcode 236. Lowest Common Ancestor of a Binary Tree
根据LCA的定义,二叉树中最小公共祖先就是两个节点p和q最近的共同祖先节点,LCA的定义没什么好解释的,主要是这道题的解法。
97 0
Leetcode 623. Add One Row to Tree
题目很简单,在树的第d层加一层,值为v。递归增加一层就好了。代码如下
101 0
LeetCode contest 190 5418. 二叉树中的伪回文路径 Pseudo-Palindromic Paths in a Binary Tree
LeetCode contest 190 5418. 二叉树中的伪回文路径 Pseudo-Palindromic Paths in a Binary Tree
LeetCode Contest 178-1367. 二叉树中的列表 Linked List in Binary Tree
LeetCode Contest 178-1367. 二叉树中的列表 Linked List in Binary Tree
LeetCode 429. N-ary Tree Level Order Traversal
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
129 0
LeetCode 429. N-ary Tree Level Order Traversal
|
存储 算法
LeetCode297. Serialize and Deserialize Binary Tree
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
138 0
LeetCode297. Serialize and Deserialize Binary Tree
LeetCode 257. Binary Tree Paths
给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。
108 0
LeetCode 257. Binary Tree Paths

热门文章

最新文章

下一篇
日志分析软件