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

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

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

相关文章

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa