二叉树面试题(三)--将搜索二叉树转为有序的双向链表、对称二叉树、另一棵树的二叉树和判断二叉树

本文主要是介绍二叉树面试题(三)--将搜索二叉树转为有序的双向链表、对称二叉树、另一棵树的二叉树和判断二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.将搜索二叉树转为有序的双向链表

给定一棵搜索二叉树,试将它转为双向链表。

二叉搜索树的特点是:它的中序遍历是有序的。

本题的思路其实就是根据中序遍历,依次取下根结点,然后处理根结点。对根结点的处理,就是设置该结点的前后引用。对结点的处理:

 //处理根private static Node prev=null;private static Node head=null;private static void buildDList(Node node) {node.left=prev;if(prev!=null){prev.right=node;}else{head=node;}prev=node;}
package com.xunpu.datastruct.tree;public class Test1 {public static class Node{char val;//值Node left;//左子树Node right;//右子树Node(char val){this.val=val;}}//将二叉搜索树转为有序的双向链表private static void inOrderSearchTree(Node root){if(root!=null){inOrderSearchTree(root.left);//处理根结点buildDList(root);inOrderSearchTree(root.right);}}//处理根private static Node prev=null;private static Node head=null;private static void buildDList(Node node) {node.left=prev;if(prev!=null){prev.right=node;}else{head=node;}prev=node;}private static Node searchTreeToSortedList(Node root){prev=null;head=null;inOrderSearchTree(root);return head;}private static Node buildSearchTree(){Node a=new Node('A');Node b=new Node('B');Node c=new Node('C');Node d=new Node('D');Node e=new Node('E');Node f=new Node('F');Node g=new Node('G');Node h=new Node('H');e.left=b;e.right=g;b.left=a;b.right=d;d.left=c;g.left=f;g.right=h;return e;}public static void main(String[] args) {Node root = buildSearchTree();Node head=searchTreeToSortedList(root);for(Node cur=head;cur!=null;cur=cur.right){System.out.print(cur.val);}}
}

2.对称二叉树

思路:空树和只有一个结点的树为对称二叉树。首先判断根结点是否为空,然后再判断再判断它的左右子树是否是镜像二叉树。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {if(root==null){return true;}if(root.left==null&&root.right==null){return true;}return isMirror(root.left,root.right);}private static boolean isMirror(TreeNode p,TreeNode q){if(p==null&&q==null){//必要!!!return true;}if(p==null||q==null){return false;}if(p.val==q.val){return isMirror(p.left,q.right)&&isMirror(p.right,q.left);}else{return false;}}
}

3.另一棵树的子树

思路:其实是判断两棵树是否相同。先判断s树是否和t树相同,然后在s的左子树中查找是否和t树相同;如果不相同,则直接返回和s的右子树比较的结果。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public boolean isSubtree(TreeNode s, TreeNode t) {return find(s,t);}//查找t的根结点是否在s中private static boolean find(TreeNode s,TreeNode t){if(s==null){return false;}//判断根这棵树是否和t树相同if(isSame(s,t)){return true;}//在根的左子树中查找t树if(find(s.left,t)){return true;}//如果在左子树中没有找到,就在右子树中找。return find(s.right,t);}//判断两棵树是否相同private static boolean isSame(TreeNode p,TreeNode q){if(p==null&&q==null){return true;}if(p==null||q==null){return false;}return p.val==q.val&&isSame(p.left,q.left)&&isSame(p.right,q.right);}
}

4.判断是否是平衡二叉树

思路:如果根结点为空,则是平衡二叉树;然后依次判断左子树和右子树是否为平衡二叉树,是,则继续判断;不是则直接返回。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public boolean isBalanced(TreeNode root) {if(root==null){return true;}if(!isBalanced(root.left)){return false;}if(!isBalanced(root.right)){return false;}int left=getLength(root.left);int right=getLength(root.right);if((left-right)>=-1&&(left-right)<=1){return true;}return false;}//求树的高度private int getLength(TreeNode root){if(root==null){return 0;}int left=getLength(root.left);int right=getLength(root.right);return (left>right?left:right)+1;        }
}

 

这篇关于二叉树面试题(三)--将搜索二叉树转为有序的双向链表、对称二叉树、另一棵树的二叉树和判断二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这