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

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

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

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的