二叉樹的層序遍歷---java實現

1、二叉樹的層序遍歷

           即按照層輸出節點

1.2  按照之字型打印

          即奇數行從左往右打印,偶數行從右往左打印。

          那麼可以藉助棧先進後出的特點實現之字形打印二叉樹,設兩個棧 stack1,stack2,stack2爲輔助棧

                奇數行,從左往右打印:當前出棧節點的左節點先入棧 右節點 再入棧(從stack1出,入stack2)

                偶數行,從右往左打印:當前出棧節點的右節點先入棧 左節點再入棧 (從stack1出,入stack2)

                輔助棧stack2中節點出棧的順序爲下一行打印的順序

一個簡單的例子:

之字形打印二叉樹

java實現的代碼如下:

public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
	Stack<TreeNode> stack1 = new Stack<TreeNode>();
	if(pRoot != null) {
		stack1.push(pRoot);
		boolean b = true;//b=true時候從左到右    b = false時候從右到左
		while(!stack1.isEmpty()) {
			ArrayList<Integer> array = new ArrayList<Integer>();
			Stack<TreeNode> stack2 = new Stack<TreeNode>();//輔助棧 初始化
			if(b) {//從左到右
				while(!stack1.isEmpty()) {
					TreeNode node = stack1.pop();
					if(node.left != null) 
						stack2.push(node.left);
					if(node.right != null) 
						stack2.push(node.right);
					array.add(node.val);	
				}
			}else {//從右到左
				while(!stack1.isEmpty()) {
					TreeNode node = stack1.pop();
					if(node.right != null)
						stack2.push(node.right);
					if(node.left != null)
					    stack2.push(node.left);
					array.add(node.val);	
				}
			}
			b = !b;
			arrays.add(array);
			stack1 = stack2;
		}
	}
	return arrays;
}

  1.3 層序遍歷2

           從上到下按層打印二叉樹,每一層節點從左至右輸出。

          藉助隊列先進先出原則就可實現。(可以通過兩個隊列,其中一個作爲輔助隊列;也可以通過一個隊列,同時以一個int型變量記錄每一層節點數即可)

java實現的代碼如下:(兩個隊列)

public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	LinkedList<TreeNode> queue1 = new LinkedList<TreeNode>();
	ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
	if(pRoot != null) {
		queue1.add(pRoot);
		while(!queue1.isEmpty()) {
			LinkedList<TreeNode> queue2 = new LinkedList<TreeNode>();
			ArrayList<Integer> array = new ArrayList<Integer>();
			while(!queue1.isEmpty()) {
				TreeNode node = queue1.poll();
				if(node.left != null)
					queue2.add(node.left);
				if(node.right != null)
					queue2.add(node.right);
				array.add(node.val);
			}
			arrays.add(array);
			queue1 = queue2;
		}
	}
	return arrays;
}

java代碼實現(一個隊列)

public ArrayList<ArrayList<Integer> > Print1(TreeNode pRoot) {
	LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
	ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
	if(pRoot != null) {
		queue.add(pRoot);
		int len  = 1;
		while(!queue.isEmpty()) {
			int val = 0;
			ArrayList<Integer> array = new ArrayList<Integer>();
			for(int i = 0; i < len; i++) {
				TreeNode node = queue.poll();
				if(node.left != null) {
					queue.add(node.left);
					val++;
				}	
				if(node.right != null) {
					queue.add(node.right);
		 		     val++;
				}
				array.add(node.val);
			}
			arrays.add(array);
			len = val;
		}
	}
	return arrays; 
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章