easy 相同的树 深度优先搜索(递归) 广度优先搜索 (队列)

在这里插入图片描述
在这里插入图片描述


树的算法

DFS 深度优先搜索(递归):

c++


/*  Depth-First-Search  */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if ( p==nullptr && q == nullptr ){
            return true;
        }else if(p==nullptr || q == nullptr ){
            return false;
        }else if(p->val !=  q->val){
            return false;
        }else{
            return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
        }
    }
};

python

python 在 def function1 中调用 function1: self.function1


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p and not q:
            return True
        elif not p or not q:
            return False
        elif p.val != q.val:
            return False
        else:
            return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
            # python 在def function1 中调用 function1: self.function1


在这里插入图片描述


BFS 广度优先搜索 (队列):

c++

STL中队列(queue)的使用方法

#include <queue>
queue <TreeNode*> queue1;  // 存放指针的队列
queue <int> queue2;   // 存放整数的队列

push(x) 将x压入队列的末端

pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值

front() 返回第一个元素(队顶元素)

back() 返回最后被压入的元素(队尾元素)

empty() 当队列为空时,返回true

size() 返回队列的长度

add() 往队列尾部插入元素,当超出队列界限的时候,抛出异常让你处理,

offer() 往队列尾部插入元素,当超出队列界限的时候,直接返回false

size() 访问队列中的元素个数

两个队列


/*Breadth-First-Search* 两个队列 /
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if ( p == nullptr && q == nullptr ){
            return true;
        }else if( p == nullptr || q == nullptr ){
            return false;
        }

        queue <TreeNode*> queue1,queue2;  // 创建队列
        queue1.push(p);   // 指针 p 进队 
        queue2.push(q);   // 指针 q 进队

        while( !queue1.empty() && !queue2.empty() ){
            auto node1 = queue1.front();  // 获取队顶元素,auto自动指定类型
            auto node2 = queue2.front(); 
            queue1.pop();   // 弹出队顶元素
            queue2.pop();

            if (node1->val != node2->val) {
                return false;
            }

            auto left1 = node1->left, right1 = node1->right;
            auto left2 = node2->left, right2 = node2->right;
            // 两个if都需要判断,所用不用else连起来
            if((left1 == nullptr) ^ (left2 == nullptr)){  // 异或,一个为空一个不为空,条件成立
                return false;
            }
            if((right1 == nullptr) ^ (right2 == nullptr)){  
                return false;
            }
            if(left1 != nullptr){
                queue1.push(left1);  // 子节点加入队列时需要注意顺序,先加入左子节点,后加入右子节点
            }
            if(right1 != nullptr){
                queue1.push(right1);
            }
            if(left2 != nullptr){
                queue2.push(left2);
            }
            if(right2 != nullptr){
                queue2.push(right2);
            }

        }

        return queue1.empty() && queue2.empty();
    }
};

一个队列


/*Breadth-First-Search* 一个队列 /
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if ( p == nullptr && q == nullptr ){
            return true;
        }else if( p == nullptr || q == nullptr ){
            return false;
        }

        queue <TreeNode*> queue1; // 创建队列
        queue1.push(p);   // 指针 p 进队 
        queue1.push(q);   // 指针 q 进队

        while( !queue1.empty() ){
            auto node1 = queue1.front();  // 获取队顶元素,auto自动指定类型
            queue1.pop();   // 弹出队顶元素
            auto node2 = queue1.front(); 
            queue1.pop();

            if (node1->val != node2->val) {
                return false;
            }

            auto left1 = node1->left, right1 = node1->right;
            auto left2 = node2->left, right2 = node2->right;
            // 两个if都需要判断,所用不用else连起来
            if((left1 == nullptr) ^ (left2 == nullptr)){  // 异或,一个为空一个不为空,条件成立
                return false;
            }
            if((right1 == nullptr) ^ (right2 == nullptr)){  
                return false;
            }
            if(left1 != nullptr){
                queue1.push(left1);  // 子节点加入队列时需要注意顺序,先加入p左子节点,后加入q左子节点
            }
            if(left2 != nullptr){
                queue1.push(left2);
            }
            if(right1 != nullptr){
                queue1.push(right1);
            }
            if(right2 != nullptr){
                queue1.push(right2);
            }

        }

        return queue1.empty();
    }
};

python

deque是双边队列,具有队列和栈的性质。相当于可以在两端操作的list


import collections

d = collections.deque([])
d.append('a') # 在最右边添加一个元素
d.appendleft('b') # 在最左边添加一个元素
d.extend(['c','d']) # 在最右边添加所有元素
d.extendleft(['e','f']) # 在最左边添加所有元素
d.pop() # 将最右边的元素取出
d.popleft() # 将最左边的元素取出
d.rotate(-2) # 向左旋转两个位置(正数则向右旋转)
d.count('a') # 队列中'a'的个数
d.remove('c') # 从队列中将'c'删除
d.reverse() # 将队列倒序
f=d.copy()  # 复制队列
f.clear()  # 清空队列


# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p and not q:
            return True
        if not p or not q:
            return False

        queue1 = collections.deque([p])   # 创建python双端队列,并放入p
        queue2 = collections.deque([q])

        while queue1 and queue2:
            node1 = queue1.popleft()  # 返回并删除队列顶端元素
            node2 = queue2.popleft()
            if node1.val != node2.val:
                return False

            left1,right1 = node1.left, node1.right
            left2,right2 = node2.left, node2.right

            if (not left1) ^ (not left2):  # 左节点
                return False
            if (not right1) ^ (not right2):   # 右节点
                return False


            if left1:
                queue1.append(left1)  # 从队尾进队
            if right1:
                queue1.append(right1)
            if left2:
                queue2.append(left2)
            if right2:
                queue2.append(right2)


        return not queue1 and not queue2

在这里插入图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值