1. 程式人生 > >將一棵二叉樹按行輸出

將一棵二叉樹按行輸出

給定一個二叉樹,按行從左到右輸出一個樹。例如按如下格式:
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即可。二叉樹寬度