- 浏览: 33419 次
- 性别:
- 来自: 北京
文章分类
最新评论
第15题(树):
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
package cn.emma.interview_15; public class Mirror { public static void getMirror(BinaryTree.TreeNode tree){ if(tree != null){ BinaryTree.TreeNode temp = tree.left; tree.left = tree.right; tree.right = temp; getMirror(tree.left); getMirror(tree.right); } } public static void main(String[] args) { try { BinaryTree bst = new BinaryTree(); int[] keys = new int[] {5, 6, 7, 8, 9, 10, 11}; for (int key: keys) { bst.insert(key); } bst.inOrderTraverse(); bst.print(); getMirror(bst.getRoot()); bst.inOrderTraverse(); bst.print(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } }
package cn.emma.interview_15; import java.util.ArrayList; import java.util.List; /** * @author Emma * @param <T> */ public class BinaryTree { private TreeNode root = null; private List<TreeNode> nodeList = new ArrayList<BinaryTree.TreeNode>(); public TreeNode getRoot() { return root; } public void setRoot(TreeNode root) { this.root = root; } public List<TreeNode> getNodeList() { return nodeList; } public void setNodeList(List<TreeNode> nodeList) { this.nodeList = nodeList; } public class TreeNode{ TreeNode parent; TreeNode left; TreeNode right; int value; public TreeNode(TreeNode parent,TreeNode left,TreeNode right,int value) { // TODO Auto-generated constructor stub this.parent = parent; this.left = left; this.right = right; this.value = value; } public int getVlaue(){ return value; } } public boolean isEmpty(){ if(root == null){ return true; }else{ return false; } } /** * 给定关键字插入到二叉查找树中 * @param value */ public void insert(int value){ TreeNode newNode = new TreeNode(null, null, null, value); TreeNode pNode; TreeNode parentNode = null; if(root == null){ root = newNode; }else{ pNode = root; while(pNode != null){ parentNode = pNode; if(pNode.getVlaue() < value){ pNode = pNode.right; }else if(pNode.getVlaue() > value){ pNode = pNode.left; }else{ System.out.println("Value " + value + " has already existed in the tree."); } } if(value < parentNode.getVlaue()){ parentNode.left = newNode; newNode.parent = parentNode; }else if (value > parentNode.getVlaue()) { parentNode.right = newNode; newNode.parent = parentNode; } } } /** * 给定关键字,删除二叉查找树的相应节点 * @param key */ public void delete(int key){ TreeNode node = search(key); if(node == null){ System.out.println("树中不包含此节点"); }else{ delete(node); } } private void delete(TreeNode node){ TreeNode parentNode = node.parent; if(node.left != null && node.right != null){ TreeNode p = processor(node); TreeNode s = successor(node); if(node == parentNode.left){ p.right = node.right; node.right.parent = p; parentNode.left = node.left; node.left.parent = parentNode; node = null; }else { s.left = node.left; node.left.parent = s; parentNode.right = node.right; node.right.parent = parentNode; node = null; } }else if(node.left != null){ parentNode.left = node.left; node.parent = parentNode; }else if(node.right != null){ parentNode.right = node.right; node.right.parent = parentNode; }else{ if(node == parentNode.left){ parentNode.left = null; }else{ parentNode.right = null; } } } /** * 搜索值为key的节点 * @param key * @return */ public TreeNode search(int key){ if(root == null){ return null; }else{ TreeNode p = root; while(p != null){ if(p.getVlaue() == key){ return p; }else if(p.getVlaue() < key){ p = p.right; }else{ p = p.left; } } return null; } } /** * 获取该树中序遍历下的前驱结点 * @param node * @return */ public TreeNode processor(TreeNode node){ TreeNode pNode = null; if(node == null){ return null; } else{ if(node.left == null){ return node.parent; }else{ pNode = node.left; while(pNode.right != null){ pNode = pNode.right; } return pNode; } } } /** * 获取该书中序遍历的后继结点 * @param node * @return */ public TreeNode successor(TreeNode node){ TreeNode sNode = null; if(node == null){ return null; }else{ if(node.right == null){ sNode = node.parent; }else { sNode = node.right; while(sNode.left != null){ sNode = sNode.left; } } return sNode; } } /** * 找出最大的关键字 * @return */ public TreeNode getMaxElement(){ if(root != null){ TreeNode p = root; while(p.right != null){ p = p.right; } return p; } return null; } /**找出最小的关键字 * @return */ public TreeNode getMinElement(){ if(root != null){ TreeNode p = root; while(p.left != null){ p = p.left; } return p; } return null; } public void inOrderTraverse(){ if(nodeList != null){ nodeList.clear(); } if(root != null){ inOrderTraverse(root); } } private void inOrderTraverse(TreeNode node){ if(node != null){ inOrderTraverse(node.left); nodeList.add(node); inOrderTraverse(node.right); } } public void print(){ System.out.println("**********中序遍历**********"); for (TreeNode node : nodeList) { System.out.print(node.getVlaue() + " "); } System.out.println(); } public int getSize(){ return getSize(root); } private int getSize(TreeNode node){ if(node != null){ return 1 + getSize(node.left) + getSize(node.right); } return 0; } // public int getInBetween(int a,int b){ // } public static void main(String[] args) { try { BinaryTree bst = new BinaryTree(); System.out.println("查找树是否为空? " + (bst.isEmpty() ? "是" : "否")); int[] keys = new int[] {15, 6, 18, 3, 7, 13, 20, 2, 9, 4}; for (int key: keys) { bst.insert(key); } System.out.println("查找树是否为空? " + (bst.isEmpty() ? "是" : "否")); TreeNode minkeyNode = bst.getMinElement(); System.out.println("最小关键字: " + minkeyNode.getVlaue()); TreeNode maxKeyNode = bst.getMaxElement(); System.out.println("最大关键字: " + maxKeyNode.getVlaue()); System.out.println("根结点关键字: " + bst.getRoot().getVlaue()); bst.inOrderTraverse(bst.getRoot()); bst.print(); System.out.println("查找 7 : " + (bst.search(7) != null ? "查找成功!" : "查找失败,不存在该关键字!")); bst.delete(7); bst.inOrderTraverse(); bst.print(); System.out.println("查找 7 : " + (bst.search(7) != null ? "查找成功!" : "查找失败,不存在该关键字!")); System.out.println("查找 12 : " + (bst.search(12) != null ? "查找成功!" : "查找失败,不存在该关键字!")); bst.insert(12); System.out.println("查找 12 : " + (bst.search(12) != null ? "查找成功!" : "查找失败,不存在该关键字!")); bst.inOrderTraverse(); bst.print(); bst.insert(16); bst.delete(6); bst.delete(4); bst.inOrderTraverse(); bst.print(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } }
相关推荐
本篇将围绕"java名企面试题"这一主题,深入探讨Java面试中可能遇到的知识点。 一、Java基础 1. Java语言特性:理解面向对象编程的基本概念,如封装、继承、多态,以及接口和抽象类的区别。 2. 数据类型与变量:区分...
"IT名企面试资料2"这个压缩包可能包含了丰富的面试和笔试题目,旨在帮助求职者提升自己的竞争力。下面我们将深入探讨与面试、笔试以及算法相关的知识点。 面试部分: 1. 技术面试:通常涉及编程语言基础(如Java, ...
100家IT名企笔试面试题 百度笔试题,中兴笔试题,腾讯笔试题,华为笔试题,联想笔试题
【计算机语言基础】 1.1 C++调用C编译器编译的函数时,为什么要加`extern "C"`? 在C++中,函数名会被编译器进行名称修饰(name mangling),以便支持函数重载等特性。而C语言不进行这样的名称修饰。...
该文本汇总了常见C++面试中遇到的各种坑,涵盖基础知识比较全面
《剑指Offer(专项突破版)数据结构与算法名企面试题精讲1》是一本专为程序员面试准备的数据结构与算法指南。作者何海涛结合自身多年的面试官经验,深入探讨了程序员在面试中必须掌握的核心知识。本书旨在帮助读者...
这些面试试题是各个名企的面试题哦,都有详细的分析,非常棒的,如果你正在找工作,千万不要错过这套试题哦~~~
"互联网名企面试笔试题"这个主题涵盖了一系列旨在测试应聘者技术能力、逻辑思维、问题解决技巧以及行业理解的题目。这些题目通常涉及到编程语言、算法与数据结构、操作系统、网络、数据库等多个IT领域的专业知识。 ...
《一线名企面试题》是针对Java程序员面试精心编纂的资料合集,尤其适合不同经验层次的初、中、高级开发者以及面试官参考。这份压缩包内容包含了2019年度的热门Java面试题,旨在帮助求职者查漏补缺,提升自身技术能力...
linux名企面试题曝光
提供的压缩包文件中包含的是微软等名企的数据结构与算法面试题,分为不同版本,覆盖了100道题目,可以按照版本号逐步学习和解题。例如: 1. **[答案修正]精选微软数据结构+算法面试100题[V0.2版,前20题].pdf** - ...
《牛客网_2018名企校招笔试真题精选技术篇》是一份针对学生和求职者的重要参考资料,它汇聚了2018年度众多知名企业的校园招聘笔试题目,旨在帮助准备参加校招的技术人才提升自己的技能水平,顺利通过筛选。...
14. **微软面试题**: - 金条问题:将金条切成1/7、2/7和4/7三段。 - 飞鸟问题:鸟飞了15英里,因为鸟的速度比火车快,一直在飞。 - 传感器问题:至少需要2个,分别放在黑白交界处。 - 时针分针重叠:一天中时针...
"名企笔试面试题总结" 以下是对给定文件信息的详细分析和知识点总结: 标题:名企笔试面试题 描述:本资源提供了多家名企(华为、阿卡、TCL、索尼、微软、百度、大唐)的笔试面试题,涵盖C++、数据结构等相关知识...
"100IT名企java面试必考面试题"这份资料很可能包含了Java面试中常见的问题和解答,旨在帮助应聘者充分准备,提升面试成功率。 Java面试通常会涵盖以下几个关键领域的知识点: 1. **基础知识**:这包括Java语法、...
面试中,C语言的考察往往涉及到语法、数据结构、内存管理、程序设计等多个方面。以下是一些C语言面试中常见的知识点: 1. `static`关键字: - `static`用于变量时,可以使变量的作用域限制在定义它的函数内部或...
【java面试题】100IT名企java面试必考面试题 (Java Interview Question 100 IT Enterprise Java Compulsory Interview Question) 【java面试题】100IT名企java面试必考面试题 (Java Interview Question 100 IT ...
众多名企(华为_阿卡_TCL_索尼_微软_百度_大唐)笔试面试题(C居多含C++及数据结构)改
《IT名企面试心经》作为拼客学院根据多年的校园招聘经验所编撰的面试指导书籍,涵盖了从招聘流程、网申内推、笔试到面试等多个环节的实用经验。该书主要面向在校学生和求职者,为他们提供应对IT行业名企招聘的一系列...