剑指Offer面试题(第五天)面试题7、8

* 面试题7:重建二叉树


     *    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
     *        假设输入的前序遍历和中序遍历的结果中都不包含重复的数字。
     *        例如:输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
     *            则重建二叉树并输出它的头节点
     *        二叉树节点的定义:
     *        struct BinaryTreeNode{
     *            int m_nValue;            //value
     *        BinaryTreeNode* m_pLeft;   //左子树
     *        BinaryTreeNode* m_pRight;  //右子树
     *        }
     *        
     *   思路:先找出根节点,然后利用递归方法构造二叉树

 

 

package Test;

import java.awt.print.Printable;
import java.util.Arrays;

public class No7construct {

	/*
	 * 面试题7:重建二叉树
	 *    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
	 *        假设输入的前序遍历和中序遍历的结果中都不包含重复的数字。
	 *        例如:输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
	 *            则重建二叉树并输出它的头节点
	 *        二叉树节点的定义:
	 *        struct BinaryTreeNode{
	 *        	int m_nValue;            //value
	 *        BinaryTreeNode* m_pLeft;   //左子树
	 *        BinaryTreeNode* m_pRight;  //右子树
	 *        }
	 *        
	 *   思路:先找出根节点,然后利用递归方法构造二叉树
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		No7construct c = new No7construct();
		
		int[] pre = {1,2,4,7,3,5,6,8};//前序遍历序列
		int[] in = {4,7,2,1,5,3,8,6};//中序遍历序列
		
		//返回后序遍历结果
		TreeNode t = c.Construct(pre,in);
		System.out.println("后序遍历结果为:");
		c.lastOrder(t);
	}

	

	//通过前序和中序遍历序列重建二叉树
	public TreeNode Construct(int[] pre, int[] in) {
		// TODO Auto-generated method stub
		if(pre == null||in == null) {
			return null;			
		}
		if(pre.length == 0||in.length == 0) {
			return null;
		}
		if(pre.length != in.length) {
			return null;
		}
		
		TreeNode root = new TreeNode(pre[0]);  //根节点为前序遍历的第一个
		for(int i = 0;i

*面试题8:二叉树的下一个节点

     *题目:给定一棵二叉树和其中的一个节点,如何找到中序遍历序列的下一个节点?
     *    树中的节点除了有两个分别指向左、右子节点的指针 ,还有一个指向父节点的指针。
     *    
     *    总结一下,下一个节点可能出现的位置:
     *    1.若这一节点有右子树,则它下一个节点就是它右子树的最左子节点
     *    2.若这一节点没有右子树,但是它是父节点的左子节点,则它下一个节点就是它的父节点
     *    3.若这一节点(节点A)没有右子树,且是父节点的右子节点,
     *         那就沿着它(节点A)的父节点(节点B)一直往上找,。。。
     *         直到找到一个节点(节点C)是其(节点C)父节点的左子节点(若有这样的节点),
     *         则它下一个节点就是  找到的这个节点(节点C)的父节点
     *         若无这样的节点,则它下一个节点为null
     *   (2情况其实是3的特殊情况  刚好其父节点就是左子节点)

 

 

package Test;

public class No8getNext {

	/*
	 *面试题8:二叉树的下一个节点
	 *题目:给定一棵二叉树和其中的一个节点,如何找到中序遍历序列的下一个节点?
	 *    树中的节点除了有两个分别指向左、右子节点的指针 ,还有一个指向父节点的指针。
	 *    
	 *    总结一下,下一个节点可能出现的位置:
	 *    1.若这一节点有右子树,则它下一个节点就是它右子树的最左子节点
	 *    2.若这一节点没有右子树,但是它是父节点的左子节点,则它下一个节点就是它的父节点
	 *    3.若这一节点(节点A)没有右子树,且是父节点的右子节点,
	 *         那就沿着它(节点A)的父节点(节点B)一直往上找,。。。
	 *         直到找到一个节点(节点C)是其(节点C)父节点的左子节点(若有这样的节点),
	 *         则它下一个节点就是  找到的这个节点(节点C)的父节点
	 *         若无这样的节点,则它下一个节点为null
	 *   (2情况其实是3的特殊情况  刚好其父节点就是左子节点)
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		No8getNext n = new No8getNext();
		//调用No8getNext的方法    也可以使用TreeNode类创建对象
		
		TreeNode_p a = new TreeNode_p(1);
		TreeNode_p b = new TreeNode_p(2);
		TreeNode_p c = new TreeNode_p(3);
		TreeNode_p d = new TreeNode_p(4);
		TreeNode_p e = new TreeNode_p(5);
		TreeNode_p f = new TreeNode_p(6);
		TreeNode_p g = new TreeNode_p(7);
		TreeNode_p h = new TreeNode_p(8);
		TreeNode_p i = new TreeNode_p(9);
		
		a.left = b;
		a.right = c;
		
		
		b.left = d;
		b.right = e;

	    c.left = f;
	    c.right = g;

	    e.left = h;
	    e.right = i;

	    h.parent = e;
	    i.parent = e;

	    e.parent = b;
	    d.parent = b;

	    f.parent = c;
	    g.parent = c;

	    b.parent = a;
	    c.parent = a;
	
	    TreeNode_p next = n.getNext(g);
	    if(next != null) {
	    	System.out.println(g.val+"节点的下一个节点为"+next.val);
	    }
	    else
	    	System.out.println(g.val+"节点无下一个节点");
	}

	public TreeNode_p getNext(TreeNode_p t) {
		// TODO Auto-generated method stub
		if(t == null) {
			return null;
		}
		
		if(t.right != null) {
			//若有右子树,则它下一个节点为它右子树的最左子节点
			t = t.right; 
			while(t.left != null){		 
				t = t.left;
			}
			return t;
		}
		
		if(t.right == null) {
			//若无右子树,看是否是其父节点们的左子节点,
			//若是则下一节点为它父节点
			while(t.parent != null) {
				if(t.parent.left == t) {
					return t.parent;
					
				}
				t = t.parent;  
				
			}
			
		}
		return null;
	}
	

	

}

class TreeNode_p{
	int val;
	TreeNode_p left;
	TreeNode_p right;
	TreeNode_p parent;
	TreeNode_p(int val){
		this.val = val;
	}
	
}

 

 

 

 

你可能感兴趣的:(面试)