`
EmmaZhao
  • 浏览: 33419 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

名企面试100题_15

 
阅读更多
第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名企面试题"这一主题,深入探讨Java面试中可能遇到的知识点。 一、Java基础 1. Java语言特性:理解面向对象编程的基本概念,如封装、继承、多态,以及接口和抽象类的区别。 2. 数据类型与变量:区分...

    IT名企面试资料2

    "IT名企面试资料2"这个压缩包可能包含了丰富的面试和笔试题目,旨在帮助求职者提升自己的竞争力。下面我们将深入探讨与面试、笔试以及算法相关的知识点。 面试部分: 1. 技术面试:通常涉及编程语言基础(如Java, ...

    100家IT名企笔试面试题

    100家IT名企笔试面试题 百度笔试题,中兴笔试题,腾讯笔试题,华为笔试题,联想笔试题

    名企AI面试100题1

    【计算机语言基础】 1.1 C++调用C编译器编译的函数时,为什么要加`extern "C"`? 在C++中,函数名会被编译器进行名称修饰(name mangling),以便支持函数重载等特性。而C语言不进行这样的名称修饰。...

    c++名企面试题汇总

    该文本汇总了常见C++面试中遇到的各种坑,涵盖基础知识比较全面

    剑指Offer(专项突破版)数据结构与算法名企面试题精讲1

    《剑指Offer(专项突破版)数据结构与算法名企面试题精讲1》是一本专为程序员面试准备的数据结构与算法指南。作者何海涛结合自身多年的面试官经验,深入探讨了程序员在面试中必须掌握的核心知识。本书旨在帮助读者...

    名企的面试试题集锦,不容错过

    这些面试试题是各个名企的面试题哦,都有详细的分析,非常棒的,如果你正在找工作,千万不要错过这套试题哦~~~

    互联网名企面试笔试题

    "互联网名企面试笔试题"这个主题涵盖了一系列旨在测试应聘者技术能力、逻辑思维、问题解决技巧以及行业理解的题目。这些题目通常涉及到编程语言、算法与数据结构、操作系统、网络、数据库等多个IT领域的专业知识。 ...

    一线名企面试题.rar

    《一线名企面试题》是针对Java程序员面试精心编纂的资料合集,尤其适合不同经验层次的初、中、高级开发者以及面试官参考。这份压缩包内容包含了2019年度的热门Java面试题,旨在帮助求职者查漏补缺,提升自身技术能力...

    linux名企面试题曝光

    linux名企面试题曝光

    数据结构和算法名企面试题

    提供的压缩包文件中包含的是微软等名企的数据结构与算法面试题,分为不同版本,覆盖了100道题目,可以按照版本号逐步学习和解题。例如: 1. **[答案修正]精选微软数据结构+算法面试100题[V0.2版,前20题].pdf** - ...

    牛客网_名企校招笔试真题精选技术篇

    《牛客网_2018名企校招笔试真题精选技术篇》是一份针对学生和求职者的重要参考资料,它汇聚了2018年度众多知名企业的校园招聘笔试题目,旨在帮助准备参加校招的技术人才提升自己的技能水平,顺利通过筛选。...

    中外名企面试笔试智力题大搜罗.doc

    14. **微软面试题**: - 金条问题:将金条切成1/7、2/7和4/7三段。 - 飞鸟问题:鸟飞了15英里,因为鸟的速度比火车快,一直在飞。 - 传感器问题:至少需要2个,分别放在黑白交界处。 - 时针分针重叠:一天中时针...

    名企(华为_阿卡_TCL_索尼_微软_百度_大唐)笔试面试题(C居多含C++及数据结构)

    "名企笔试面试题总结" 以下是对给定文件信息的详细分析和知识点总结: 标题:名企笔试面试题 描述:本资源提供了多家名企(华为、阿卡、TCL、索尼、微软、百度、大唐)的笔试面试题,涵盖C++、数据结构等相关知识...

    100IT名企java面试必考面试题.PDF

    "100IT名企java面试必考面试题"这份资料很可能包含了Java面试中常见的问题和解答,旨在帮助应聘者充分准备,提升面试成功率。 Java面试通常会涵盖以下几个关键领域的知识点: 1. **基础知识**:这包括Java语法、...

    C语言面试题总汇(名企面试题总汇)

    面试中,C语言的考察往往涉及到语法、数据结构、内存管理、程序设计等多个方面。以下是一些C语言面试中常见的知识点: 1. `static`关键字: - `static`用于变量时,可以使变量的作用域限制在定义它的函数内部或...

    【java面试题】100IT名企java面试必考面试题 Java Interview Question

    【java面试题】100IT名企java面试必考面试题 (Java Interview Question 100 IT Enterprise Java Compulsory Interview Question) 【java面试题】100IT名企java面试必考面试题 (Java Interview Question 100 IT ...

    众多名企(华为_阿卡_TCL_索尼_微软_百度_大唐)笔试面试题(C居多含C++及数据结构)改.doc

    众多名企(华为_阿卡_TCL_索尼_微软_百度_大唐)笔试面试题(C居多含C++及数据结构)改

    IT名企面试心经

    《IT名企面试心经》作为拼客学院根据多年的校园招聘经验所编撰的面试指导书籍,涵盖了从招聘流程、网申内推、笔试到面试等多个环节的实用经验。该书主要面向在校学生和求职者,为他们提供应对IT行业名企招聘的一系列...

Global site tag (gtag.js) - Google Analytics