博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Same Tree】cpp
阅读量:6041 次
发布时间:2019-06-20

本文共 4809 字,大约阅读时间需要 16 分钟。

题目:

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 a binary tree node. * 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 && !q ) return true;        stack
sta_p,sta_q; if (p) sta_p.push(p); if (q) sta_q.push(q); while ( !sta_p.empty() && !sta_q.empty() ){ TreeNode * tmp_p = sta_p.top(); sta_p.pop(); TreeNode * tmp_q = sta_q.top(); sta_q.pop(); // node val if ( tmp_p->val==tmp_q->val ){ // right child if ( tmp_p->right && tmp_q->right ){ sta_p.push(tmp_p->right); sta_q.push(tmp_q->right); } else if ( !tmp_p->right && !tmp_q->right ) {} else{ return false; } // left child if ( tmp_p->left && tmp_q->left ){ sta_p.push(tmp_p->left); sta_q.push(tmp_q->left); } else if ( !tmp_p->left && !tmp_q->left ) {} else{ return false; } } else { return false; } } return sta_p.empty() && sta_q.empty(); }};

tips:

二叉树先序遍历。

1. 比较节点val

2. 比较节点right child

3. 比较节点left child

========================

学习了一个更简洁版的代码,主要简洁的地方是入栈时候不需要判断为NULL。

代码:

/** * Definition for a binary tree node. * 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
sta_p,sta_q; sta_p.push(p); sta_q.push(q); while ( !sta_p.empty() && !sta_q.empty() ) { p = sta_p.top(); sta_p.pop(); q = sta_q.top(); sta_q.pop(); if ( !q && !p ) continue; if ( !q || !p ) return false; if ( p->val!=q->val ) return false; sta_p.push(p->right); sta_p.push(p->left); sta_q.push(q->right); sta_q.push(q->left); } return sta_p.empty() && sta_q.empty(); }};

==============================================

第二次过这道题,第一次没有AC:有个思维陷阱,如果线序遍历输出的顺序相同,两棵树不一定完全相等。改了一次后AC了。

/** * Definition for a binary tree node. * 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
sta1; if (p) sta1.push(p); stack
sta2; if (q) sta2.push(q); while ( !sta1.empty() && !sta2.empty() ) { TreeNode* n1 = sta1.top(); sta1.pop(); TreeNode* n2 = sta2.top(); sta2.pop(); if ( n1->val != n2->val ) return false; // right child if ( n1->right && n1->right ) { sta1.push(n1->right); sta2.push(n2->right); } else if ( !n1->right && !n2->right ) {} else { return false; } // left child if ( n1->left && n1->left ) { sta1.push(n1->left); sta2.push(n2->left); } else if ( !n1->left && !n2->left ) {} else { return false; } } return sta1.empty() && sta2.empty(); }};

 再补上一个递归版的。

/** * Definition for a binary tree node. * 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 && q )            {                if ( p->val==q->val )                {                    return Solution::isSameTree(p->left, q->left) && Solution::isSameTree(p->right, q->right);                }                else                {                    return false;                }            }            else if ( !p && !q )            {                return true;            }            else            {                return false;            }        }};

 

转载于:https://www.cnblogs.com/xbf9xbf/p/4505032.html

你可能感兴趣的文章
C++ ofstream和ifstream详细用法
查看>>
Mysql 连接查询 Mysql支持的连接查询有哪些
查看>>
Hive Streaming 追加 ORC 文件
查看>>
打开Apache自带的Web监视器
查看>>
eclipse插件
查看>>
Android笔记:通过RadioGroup/RadioButton自定义tabhost的简单方法
查看>>
ELCSlider
查看>>
XCode工程中 Targets详解
查看>>
Ext.Msg.prompt的高级应用
查看>>
Postgres 中 to_char 格式化记录
查看>>
关于联合索引
查看>>
开源 java CMS - FreeCMS2.7 登录移动端管理中心
查看>>
Android FM模块学习之三 FM手动调频
查看>>
Python 设置系统默认编码以及其他编码问题大全
查看>>
Vbs脚本编程简明教程之十四
查看>>
如何UDP/TCP端口是否通了
查看>>
pxe实现系统的自动化安装
查看>>
Redis高可用技术解决方案总结
查看>>
Scale Out Owncloud 高可用(2)
查看>>
何为敏捷
查看>>