將一棵二叉樹按行輸出
給定一個二叉樹,按行從左到右輸出一個樹。例如按如下格式:
6
5 15
7 9 10 50
1、遞迴計算,感覺這種辦法好傻
public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null)return new ArrayList<List<Integer>>();
List<List<Integer>> listleft=null;
List<List<Integer>> listright=null;
List<List<Integer>> list=new ArrayList<List<Integer>>();
if(root.left!=null){
listleft=levelOrder(root.left);
}
if(root.right!=null){
listright=levelOrder(root.right);
}
if(listleft==null &&listright!=null){
List<Integer> newList=new ArrayList<Integer>();
newList.add(root.val);
list.add(newList);
list.addAll(listright);
return list;
}
if(listleft!=null&&listright==null){
List <Integer> newList=new ArrayList<Integer>();
newList.add(root.val);
list.add(newList);
list.addAll(listleft);
return list;
}
if(listleft==null&&listright==null){
List<Integer> newList=new ArrayList<Integer>();
newList.add(root.val);
list.add(newList);
return list;
}
List<Integer> newList=new ArrayList<Integer>();
newList.add(root.val);
list.add(newList);
int lengthleft=listleft.size();
int lengthright=listright.size();
int i=0,j=0;
while(i<lengthleft&&j<lengthright){
listleft.get(i).addAll(listright.get(j));
j++;i++;
}
list.addAll(listleft);
if(j<lengthright){
for(i=j;i<lengthright;i++){
list.add(listright.get(i));
}
}
return list;
}
2、因為是按層的,根據先序遍歷,所有可以用一個level來表示層,向level對應的list中新增資料。
public static void getList(TreeNode root, int level,
List<List<Integer>> list) {
if (root == null)
return;
if (list.size() > level) {
List<Integer> temp = list.get(level);
temp.add(root.val);
} else {
List<Integer> temp = new ArrayList<>();
temp.add(root.val);
list.add(level, temp);
}
getList(root.left, level + 1, list);
getList(root.right, level + 1, list);
}
3、利用佇列,先序遍歷。
public static void getList(TreeNode root,List<List<Integer>> list){
Queue<TreeNode> queue=new LinkedList<>();
if(root==null)return;
queue.add(root);
int size=queue.size();
while(!queue.isEmpty()){
List<Integer> temp=new ArrayList<>();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
temp.add(node.val);
if(node.left!=null)queue.add(node.left);
if(node.left!=null)queue.add(node.right);
}
list.add(temp);
size=queue.size();
}
}
相關推薦
將一棵二叉樹按行輸出
給定一個二叉樹,按行從左到右輸出一個樹。例如按如下格式: 6 5 15 7 9 10 50 1、遞迴計算,感覺這種辦法好傻 public List<List<Integer>> levelOrder(TreeNode ro
《劍指offer》把一棵二叉樹列印成多行
注:此部落格不再更新,所有最新文章將發表在個人獨立部落格limengting.site。分享技術,記錄生活,歡迎大家關注 題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 im
C++作業:將左右孩子互換 / 複製一棵二叉樹
/* 邵發, 1309班, */ /* 12周作業 練習1:編寫遞迴演算法、將左右孩子互換 (用遞迴) 練習2:編寫複製一棵二叉樹 (不用遞迴) */ #include <stdio.h> // 定義節點 struct Node { int val
C++ 推斷一棵二叉樹是否對稱
ack iostream 們的 log data 簡單 src -a nbsp 一棵二叉樹對稱,就是說它假設以根為軸,翻轉過去一樣。例如以下圖所看到的,以虛線為軸。把左邊翻轉到右邊,各頂點及頂點中的值一一相應。
[LeetCode] Trim a Binary Search Tree 修剪一棵二叉樹
imm res all ret bsp search root nts aries Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree s
二叉樹按行打印,換行。。。。
二叉樹按行打印public class Tree { TreeNode last; TreeNode nlast; public void printTree(TreeNode root) { Queue<TreeNode> queue = new Link
判斷一棵二叉樹是否為二叉排序樹
truct bool 結點 i++ true 源代碼 flag brush %d 判斷二叉排序樹的代碼如下: static boolean IsSearchTree(Bitree *t) { if(!t) //空二叉樹情況 return
兩種遍歷方式可以唯一確定一棵二叉樹嗎?
按照資料結構課本上的說法: 前序遍歷+中序遍歷 後序遍歷+中序遍歷 可以唯一確定一棵二叉樹。 反例: 1 &nbs
判斷一棵二叉樹是否為另一棵二叉樹的子結構(JAVA版本)
分析:判斷root1是否為root2的子樹?首先,必須先找到樹1中與樹2的根節點相同的節點,然後判斷從該節點開始root1中是否root2的結構;若有,則返回true,若沒有,則返回false?答案是No! 因為二叉樹root1中可能含有值相同的節點,所以,如果沒有找到,就需要繼續遍歷root1.
劍指offer:輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 //後續遍歷二叉樹,遍歷過程中求子樹高度,判斷是否平衡 class Solution { public: bool IsBalanced(TreeNode *root, int & dep){
如何遍歷一棵二叉樹?
二叉樹的遍歷分為三種:前序遍歷 中序遍歷 後序遍歷 前序遍歷:按照“根左右”,先遍歷根節點,再遍歷左子樹 ,再遍歷右子樹 中序遍歷:按照“左根右“,先遍歷左子樹,再遍歷根節點,最後遍歷右子樹 後續遍歷:按照“左右根”,先遍歷左子樹,再遍歷右子樹,最後遍歷根節點 其中前
Swift根據先序和中序確定一棵二叉樹
先序:12453687 後序:42518637 // // TreeNode.swift // Swift-Algorithm // // Created by Seven on 2018/10/19. // Copyright © 2018年 seven.
【資料結構週週練】020 利用遞迴判斷一棵二叉樹是否為二叉排序樹
一、二叉排序樹 二叉排序樹可以說是資料結構中相當重要的內容之一啦,前兩次給大家講了二叉排序樹的建立、遍歷與查詢。今天給大家分享的是二叉排序樹的應用,判斷一個二叉樹是否為一棵二叉排序樹。 二叉排序樹的特點大家都知道,左子樹根結點值<根結點<右子樹根結點值,並且中
重建一棵二叉樹
根據先序,中序重建一棵二叉樹; 思路:中序確定根節點,遞迴到葉子,在回溯建樹 程式碼: #include <iostream> #include <assert.h> using namespace std; typedef char Datatype; stru
給定一棵二叉樹,和一個數值。求二叉樹的路徑和等於給定值的所有路徑
判斷是否有路徑 bool hasPathSum(TreeNode *root, int sum) { if(root==NULL) return false; sum-=root->val;
複製一棵二叉樹的非遞迴演算法
二叉連結串列型別定義: typedef char TElemType; // 設二叉樹的元素為char型別 typedef struct BiTNode { TElemType data; BiTNode *lchild, *rchild; } BiT
《牛客網劍指offer38題》輸入一棵二叉樹,求該樹的深度
題目:輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 結果:牛客網編譯通過 思路及程式碼: //中心思想就是遞迴遍歷一遍二叉
程式設計實現求一棵二叉樹的最短樹路徑和最長樹路徑
Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest
給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷
#include <stdio.h> #include <string.h> struct Node{ Node *lChild; Node *rChild; char c; }Tree[50]; //靜態記憶體分配陣
以二叉連結串列的方式建立一棵二叉樹,並以非遞迴演算法中序輸出;計算二叉樹的繁茂度,並判斷二叉樹是否為完全二叉樹
以二叉連結串列的方式存二叉樹,輸入時要以先序方式輸入,其中,空子樹用#表示。 二叉樹的繁茂度定義為其高度乘其每層結點最大值。演算法為先用遞迴演算法求二叉樹高度:其高度為左右子樹最大值加1,所以用先序遍歷,定義ld與rd分別為左右子樹高度,最後返回其較大值加1即可。二叉樹寬度