Same Tree--比较两个二叉树是否相同

本文介绍了如何判断两个二叉树是否相同,要求结构完全一致且节点值相同。通过递归方式实现,考虑了左右子树可能为空的情况。并提供了代码实现,期待更多优化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题:

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) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
         }
};


晓东分析:

其实两个二叉树是否相同的判断,看起来还是蛮简单的,若用递归实现的话,就是要左,右节点作为根节点的二叉树是都是相同的,且val也要是相同的即可。

只是需要考虑几个特殊情况,比如左右节点一个是null一个不是这样的情况。

 

代码实现:

/**
 * 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) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        if(p == NULL && q == NULL) return true;
        if(!(p != NULL && q != NULL)) return false;
        bool left_result = isSameTree(p->left, q->left);
        bool right_result = isSameTree(p->right, q->right);
        bool value_result = p->val == q->val;
        return (left_result == true && right_result == true && value_result == true)? true: false;
        }
};


执行结果:

 

52 / 52test cases passed.
Status:
Accepted
Runtime: 16 ms

希望大家有更好的算法能够提出来,不甚感谢。

 

若您觉得该文章对您有帮助,请在下面用鼠标轻轻按一下“顶”,哈哈~~·

 

; } } ``` 6. 本地数据库代码 `NoteDatabase.java`: ```java public class NoteDatabase { 判断两个二叉树是否完全相同,需要比较它们的每个节点是否相同。具体的比 private SQLiteDatabase mDatabase; public NoteDatabase(Context context) { mDatabase = new NoteDatabaseHelper(context).getWritableDatabase(); } // 插入一条笔记数据 public void insert(Note note) { ContentValues values = new ContentValues(); 较过程可以使用递归来实现,具体步骤如下: 1. 如果两个二叉树的根节点 values.put("title", note.getTitle()); values.put("content", note.getContent()); mDatabase.insert("note", null, values); 都为空,则它们完全相同,返回True; 2. 如果两个二叉树的根节点中有一个为空 } // 更新一条笔记数据 public void update(Note note) { ContentValues values = new ContentValues(); ,另一个不为空,则它们不相同,返回False; 3. 如果两个二叉树的根节点的值 values.put("title", note.getTitle()); values.put("content", note.getContent()); mDatabase.update("note", values, "_id不相同,则它们不相同,返回False; 4. 分别递归比较两个二叉树的左=?", new String[] {String.valueOf(note.getId())}); } // 删除一条笔记数据 public void delete(int子树和右子树,如果左子树和右子树都相同,则它们的根节点也相同,返回 id) { mDatabase.delete("note", "_id=?", new String[] {String.valueOf(id)}); } // 查询所有True;否则返回False。 下面是Python的递归实现代码: ```python def isSameTree(p, q): 笔记数据 public List<Note> query(String keyword) { List<Note> noteList = new ArrayList<>(); Cursor # 如果两个二叉树的根节点都为空,则它们完全相同 if not p and not q: cursor = mDatabase.query("note", null, "title like ? or content like ?", new String[] {"%" + keyword + "%", "%" return True # 如果两个二叉树的根节点中有一个为空,另一个不为空,则它们不相 + keyword + "%"}, null, null, "_id desc"); if (cursor != null) { while (cursor.moveToNext()) { 同 elif not p or not q: return False # 如果两个二叉树的根节点的值不相 Note note = new Note(); note.setId(cursor.getInt(cursor.getColumnIndex("_id"))); note.setTitle(cursor.getString(cursor.getColumnIndex("title"))); note.setContent(cursor.getString(cursor.getColumnIndex("content"))); noteList.add(note); } cursor.close(); } return noteList; 同,则它们不相同 elif p.val != q.val: return False # 分别递归比较两 } // 数据库帮助类 private static class NoteDatabaseHelper extends SQLiteOpenHelper { private static final String个二叉树的左子树和右子树 else: return isSameTree(p.left, q.left) and is DATABASE_NAME = "note.db"; private static final int DATABASE_VERSION = 1; public NoteDatabaseHelper(Context context) { SameTree(p.right, q.right) ``` 其中,p和q分别表示要比较两个二叉树的根节点。如果返回True,则表示两个二叉树完全相同;如果返回False,则表示它们不相同
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值