1. 程式人生 > >把二叉樹列印成多行 java

把二叉樹列印成多行 java

利用層次遍歷的演算法,設定變數last指向當前層的最後一個節點,設定變數count記錄當前層已經訪問的節點的個數,當count等於last時,表示該層訪問結束。

層次遍歷在求樹的寬度、輸出某一層節點,某一層節點個數,每一層節點個數都可以採取類似的演算法。

樹的寬度:在樹的深度演算法基礎上,加一個記錄訪問過的層節點個數最多的變數max,在訪問每層前maxlast比較,如果max比較大,max不變,如果max小於last,把last賦值給max;

package niuke.easy;

import java.util.ArrayList;
import java.util.LinkedList;

public class PrintBinaryTree {

	public static void main(String[] args) {

	}

	/**
	 * 利用層次遍歷的演算法,設定變數last指向當前層的最後一個節點,設定變數count記錄當前層已經訪問的節點的個數,當count等於last時,
	 * 表示該層訪問結束。 層次遍歷在求樹的寬度、輸出某一層節點,某一層節點個數,每一層節點個數都可以採取類似的演算法。
	 * 樹的寬度:在樹的深度演算法基礎上,加一個記錄訪問過的層節點個數最多的變數max
	 * ,在訪問每層前max與last比較,如果max比較大,max不變,如果max小於last,把last賦值給max;
	 * 
	 * @param pRoot
	 * @return
	 */
	public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
		ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

		if (pRoot == null) {
			return list;
		}

		int count = 0;
		int last = 0;
		TreeNode current = pRoot;
		LinkedList<TreeNode> queue = new LinkedList<TreeNode>();

		queue.offer(current);

		while (!queue.isEmpty()) {
			count = 0;
			last = queue.size();
			ArrayList<Integer> tempList = new ArrayList<Integer>();

			// 列印一層
			while (count < last) {
				current = queue.pop();
				tempList.add(current.val);

				count++;
				if (current.left != null) {
					queue.offer(current.left);
				}
				if (current.right != null) {
					queue.offer(current.right);
				}
			}
			list.add(tempList);
		}

		return list;
	}
}


程式碼2:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.*;

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

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

    }

}
*/
public class Solution {
     ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        //先把需要的準備好
        ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();//queue 是一個介面
         
        if(pRoot != null){
            int nextNodes = 0;
            int needPrint = 1;//初始狀態,下一層節點0,需要被列印的結點1,下一層節點在迴圈中遞增
            queue.add(pRoot);
             
            while(!queue.isEmpty()){
                //隊不空的情況下
                TreeNode node = queue.peek();
                list.add(node.val);//只需要把結點的值存起來就行了
                 
                if(node.left != null){
                    queue.add(node.left);
                    ++nextNodes;
                }
                 
                if(node.right != null){
                    queue.add(node.right);
                    ++nextNodes;
                }
                 
                queue.poll();//移除佇列一個元素
                 
                --needPrint;
                if(needPrint == 0){
                    arrayList.add(new ArrayList(list));//一行打完了,到下一行
                    list.clear();
                    needPrint = nextNodes;
                    nextNodes = 0;
                }
            }
        }
         
        return arrayList;
    }
    
}


相關推薦

列印java實現

從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 思路:定義一個佇列,遍歷二叉樹,並將結點入佇列,每入一層處理一層,保證一層一層地放入陣列中。 import java.uti

列印 java

利用層次遍歷的演算法,設定變數last指向當前層的最後一個節點,設定變數count記錄當前層已經訪問的節點的個數,當count等於last時,表示該層訪問結束。 層次遍歷在求樹的寬度、輸出某一層節

劍指offer系列——按之字形順序列印列印,序列化二

按之字形順序列印二叉樹 題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 解題思路: 法一: 需要兩個棧。我們在列印某一行節點時,把下一層的子節點儲存到相應的棧裡。 如果

劍指Offer 60. 列印

題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 題目地址 https://www.nowcoder.com/practice/445c44d982d04483b04a54f298796288?tpId=13&tqId=11213&rp=3&ru=/ta/co

劍指offer 60. 列印

題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 思路: 兩個棧,分二級,第一級存一行的數curStack,第二級存著一行數所對應的left,right的值nextStack,每次結束 一輪迴圈,把curStack的值給result,然後再將nodes設

(劍指offer)列印

時間限制:1秒 空間限制:32768K 熱度指數:101798 題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 思路 import java.util.ArrayList; /* public class TreeNode { int

列印

題目 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 思路1 層序遍歷,只有一點需要考慮,就是如何把層序遍歷序列按層分開來,因為返回的是每一層的遍歷序列。 最簡單的做法是遍歷當前層的時候就逐步確定下一層最右邊的結點(遍歷的過程中,下一層

劍指Offer_程式設計題60:列印

題目:從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 牛客網:連結 總感覺這樣的題不是這麼做的。就像陣列一樣,有簡便方法。 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self

劍指offer-------列印

題目: 思路: 程式碼: struct TreeNode { int val; TreeNode *left; TreeNode *right; } void Print(BinaryTreeNOde* pRoot) { if(pRoot == NUL

劍指offer -- 列印

題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 AC程式碼 層次遍歷二叉樹用到的資料結構是佇列。 import java.util.ArrayList; import java.util.Queue; import java.util

列印 python

class Solution: # 返回二維列表[[1,2],[4,5]] def Print(self, pRoot): # write code here if not pRoot: return [] tr

牛客網劍指offer-列印

題目描述從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。/* struct TreeNode { int val; struct TreeNode *left;

劍指offer--面試題60:列印

題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 python實現: # -*- coding:utf-8 -*- # class TreeNode: #     de

資料結構-劍指offer-列印

題目:從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。因為要按層列印,首先想到的是層次遍歷。在二叉樹的深度這道題中,首先應用到了層次遍歷。每一層的節點值存入一個小vector c,再把小vector c存到大vector vec中,列印vec。(題目沒有要求換

《劍指offer》:[60]列印

題目:從上到下安層列印二叉樹,同一層的結點按從左到右的順序列印,每一層列印一行。例如,圖(1)中二叉樹以及列印結果為: 這個題其實很簡單,我們只需要設定兩個變數就可以搞定。一個變量表示當前層中還沒有

劍指offer_列印+之字形

/* 1. 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 按層次列印可以用佇列,如何保證一層輸出一行, 進佇列的時候,加標記,出隊時候遇到標記則一行結束 劍指offer思路: 用兩個變量表示當前層還未列印的節點數和下一層的節點數 */ import

劍指Offer-Java-列印

題目 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 程式碼 此處只需要一個佇列進行層序遍歷即可。 import java.util.*; /* public class Tre

劍指Offer——列印層序遍歷)

對於二叉樹的最好的解決辦法就是遞迴。遍歷方法無外乎先序遍歷,中序遍歷,後序遍歷方法以及層序遍歷方法。這裡給大家安利一個關於樹的面試題的連結,博主walkinginthewind比較全面且詳細的介紹了二叉樹相關的面試題:對於層序遍歷,最好的方法就是用佇列記錄遍歷節點的值,按層列

列印 c++

題目描述從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。/*struct TreeNode {   int val;   struct TreeNode *left;   struct TreeNode *right;   TreeNode(int x) : 

牛客網刷題之列印

題目描述: 解題思路: 這題和前面之字形列印那題類似,不同的是,判斷到達每一層重點時只需要換行即可。同樣可以用start和end兩個代表每一行的起始與終止。其他就是樹的遍歷問題了。 題解: ArrayList<ArrayList<In