反轉二叉樹


反轉二叉樹

輸入一個二叉樹,輸出其鏡像。

如下圖,即交換所有節點的左右子樹。

\

 

這里提供兩種思路:使用遞歸和不使用遞歸。

使用的二叉樹定義如下:

 

public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}


解決方法:

 

 

import java.util.LinkedList;
import java.util.Scanner;

/*
 * 題目描述:輸入一個二叉樹,輸出其鏡像。
 * */
public class Solution {
	Scanner scanner = new Scanner(System.in);
	
	// 建立二叉樹
	public TreeNode createTree(TreeNode root) {
		String val;
		val = scanner.next(); // next方法每次取到一個間隔符前面的數據
		if(val.equals("#")) {
			return null;
		}
		root = new TreeNode(Integer.parseInt(val));  System.out.println("輸入的數據為:" + val);
		root.left = createTree(root.left);
		root.right = createTree(root.right);
		return root;
	}
	// 得到二叉樹的鏡像  —— 遞歸的方式
    public void Mirror(TreeNode root) {
    	if(root == null) {
    		return;
    	}
    	if((root.left == null) && (root.right == null)) {
    		return;
    	}
    	TreeNode temp = root.left;
    	root.left = root.right;
    	root.right = temp;
    	Mirror(root.left);
    	Mirror(root.right);
    }
    // 得到二叉樹的鏡像 —— 不使用遞歸
    public void MirrorNotRecursive(TreeNode root) {
    	java.util.LinkedList stack = new java.util.LinkedList();
    	TreeNode temp = null;
    	if(root == null) {
    		return;
    	}
    	stack.add(root);
    	while(stack.size() != 0) {
    		TreeNode node = stack.removeFirst();
    		temp = node.left;
    		node.left = node.right;
    		node.right = temp;
    		if(node.right != null) {
    			stack.add(node.right);
    		}
    		if(node.left != null) {
    			stack.add(node.left);
    		}
    	}
    }
    
    // 層次遍歷二叉樹
    public void levelTraverse(TreeNode root) {
    	if (root == null) {
    		return;
    	}
    	LinkedList list = new LinkedList();
    	list.add(root);
    	while (list.size() != 0) {
    		TreeNode node = list.removeFirst(); // list.removeFirst() 該方法LinkedList才有
    		System.out.print(node.val + " ");
    		if(node.left != null) {
    			list.add(node.left);
    		}
    		if(node.right != null) {
    			list.add(node.right);
    		}
    	}
    }
    
    public static void main(String[] args) {
    	Solution solution = new Solution();
    	TreeNode root = null;
    	root = solution.createTree(root);
    	System.out.println("原二叉樹的層次遍歷");
    	solution.levelTraverse(root);
    	solution.Mirror(root);
    	System.out.println("\n輸出該二叉樹的鏡像");
    	solution.levelTraverse(root);
    	solution.MirrorNotRecursive(root);
    	System.out.println("\n輸出該二叉樹的鏡像(非遞歸方式)");
    	solution.levelTraverse(root);
    }
}

/*
 * 測試數據:
 * 1 2 3 # 4 # # 5 6 # # # 7 8 # # 9 10 # # 11 # #  (說明:其中#說明左右子樹為空)
 * 用先序遍歷來建立樹后,層次遍歷結果為: 1 2 7 3 5 8 9 4 6 10 11
 * 反轉二叉樹之后:1 7 2 9 8 5 3 11 10 6 4 
 */

算法之:翻轉二叉樹

 
 

事情大概是說,Max Howell 去 Google 面試,面試官說:雖然在 Google 有 90% 的工程師用你寫的 Homebrew,但是你居然不能在白板上寫出翻轉二叉樹的代碼,所以滾蛋吧。

 


/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) {//一定要檢查指針為空 return null; } root.left = invertTree(root.left); root.right = invertTree(root.right); TreeNode tmp = root.left; root.left = root.right; root.right = tmp; return root; } }


那么這道題考查了什么呢?我覺得主要是考查了遞歸的思想。遞歸是程序設計的精髓,掌握了他可以將一個大問題分解成小問題,繼而求解。比如對於此題來說,反轉一個二叉樹其實就是:

  1. 反轉二叉樹的左右子樹
  2. 將左右子樹交換

而第 1 步又是一個反轉二叉樹的問題,所以就可以用遞歸來處理了。然后再考慮好遞歸的結束條件,這道題就可以解決了。

 

考查算法題會不會太片面?

是的,算法在工作中運用得比較少,一般人也不會在工作中專門積累解算法題的能力。所以通常做算法題最強的是應屆生,因為他們有時間去刷題。而在實際 工作中,很多能力,都比算法能力重要。比如對代碼的潔癖,對設計模式的理解,對計算機底層(操作系統、網絡)的理解,對待工作的態度等。

那么,為什么那么多公司不考查,或者不重點考查這些,而只是問算法題呢?

答案很簡單,因為要在幾個小時內了解一個人太難了。通常一場面試只有一個小時,如果要在一個小時內把上面說到的知識點都面面俱到的考查,是做不到 的。但是如果花幾天來考查,對於公司和求職者都是不可接受的。所以,很多大公司就用面算法題的方式來偷懶,因為這種方式雖然可能會誤傷很多優秀的人才,但 是不合格的人,要混進去還是相當困難的。

講一句不好聽的,很多公司在招聘的時候,首先根據學校,把非 985 的學校簡歷都過濾掉,也是一種不太合理,但是有效的方法。清華北大的人一定就牛逼嗎?不一定,但是從概率上講,比南翔技校的人通過面試的機會要高一些。所 以,為了提高面試效率和成本,就直接把一般學校的簡歷過濾掉,這是一個不人道,但是從經濟上合理的行為。

 

所以熟悉算法題是必須的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM