剑指offer:树的子结构、二叉树的镜像、对称的二叉树

2024-02-01 08:32

本文主要是介绍剑指offer:树的子结构、二叉树的镜像、对称的二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

剑指offer:树的子结构、二叉树的镜像、对称的二叉树

题目: 树的子结构: 输入两棵二叉树A和B,判断B是不是A的子结构。
  分析:
       1. 查找树A中与树B根节点一样的结点(树的遍历)。
       2. 判断A中以该结点为根节点的子树是不是和B具有一样的结构。 
       
       
  注:在写树的代码的时候,要时刻注意该地址是否可能是nullptr

/*struct TreeNode {int val;          //如果定义的是double类型的时候,不能直接使用==判断 struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public://第一步检查根节点是否存在是要遍历完所有的结点,所以要定义result在最后才return bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){bool result = false; if (pRoot1 != nullptr && pRoot2 != nullptr){// 按照根左右进行遍历 if (pRoot1->val == pRoot2->val) result = Does_has_B(pRoot1, pRoot2);if (!result) result = HasSubtree(pRoot1->left, pRoot2);if (!result) result = HasSubtree(pRoot1->right, pRoot2);}return result;}
private://第二步,检查是否含有B树,只要其中任何一个结点不相等或者树A没了,就需要return false bool Does_has_B(TreeNode* pRoot1, TreeNode* pRoot2){if (pRoot2 == nullptr) return true;if (pRoot1 == nullptr) return false;if (pRoot1->val != pRoot2->val) return false;return Does_has_B(pRoot1->left, pRoot2->left) && Does_has_B(pRoot1->right, pRoot2->right);}
};

题目:二叉树的镜像:完成一个函数,输入一棵二叉树,该函数输出它的镜像

镜像的意思其实就是,左右子树互换,但是要注意,是要递归互换。

/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:void Mirror(TreeNode *pRoot) {if (pRoot == nullptr) return;TreeNode* pTemp = pRoot->left;pRoot->left = pRoot->right;pRoot->right = pTemp;if (pRoot->left != nullptr) Mirror(pRoot->left);if (pRoot->right != nullptr) Mirror(pRoot->right);//当所有的都调整完毕后,return return;}
};

题目: 实现一个函数,判断一颗二叉树是不是对称的。如果一个二叉树和它的镜像相同,则为对称二叉树。
思路:建立先序遍历的镜像形式,先序遍历本身是根左右,现在建立一种新的方式,根右左,但是要注意遍历到nullptr,

这样可以避免错误。

/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:bool isSymmetrical(TreeNode* pRoot){return isSymmetrical_private(pRoot, pRoot);}
private:bool isSymmetrical_private(TreeNode* pRoot1, TreeNode* pRoot2){if (pRoot1 == nullptr && pRoot2 == nullptr) return true;if (pRoot1 == nullptr || pRoot2 == nullptr) return false;if (pRoot1->val != pRoot2->val) return false;// 等于将root1先序遍历,将root2对称先序遍历,也就是根右左 return isSymmetrical_private(pRoot1->left, pRoot2->right) && isSymmetrical_private(pRoot1->right, pRoot2->left);}
};

 

这篇关于剑指offer:树的子结构、二叉树的镜像、对称的二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666690

相关文章

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

OpenStack镜像制作系列5—Linux镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作

OpenStack镜像制作系列4—Windows Server2019镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录  CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作系

OpenStack镜像制作系列2—Windows7镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作系列

OpenStack镜像制作系列1—环境准备

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作

CSDN:OpenStack镜像制作教程指导(全)

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录,涉及基本环境准备、常见类型操作系统的镜像制作。 让你可以从零开始安装一个操作系统,并支持个性化制作OpenStack镜像。 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows

OpenStack Victoria版——4.控制节点-Glance镜像服务组件

4.控制节点-Glance镜像服务组件 更多步骤:OpenStack Victoria版安装部署系列教程 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版 离线安装部署系列教程(全) OpenStack Train版 离线安装部署系列教程(全) 欢迎留言沟通,共同进步。 文章目录 创建glanc

docker学习系列(四)制作基础的base项目镜像--jdk+tomcat

前面已经完成了docker的安装以及使用,现在我们要将自己的javaweb项目与docker结合 1.1准备jdk+tomcat软件 ​​我下载了apache-tomcat-7.0.68.tar.gz和jdk-7u79-linux-x64.tar.gz,存储于Linux机器的本地目录/usr/ect/wt/下(利用xshell上传)。利用linux命令 tar -zxvf apache-tom

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo