2017 从上到下打印树新解法

简介: 老解法:   using namespace std; struct Node { int value; Node* lchild; Node* rchild; }; queue Q; void bfs(Node* pn) { if(pn == NULL) return; Q.

老解法:

 

using namespace std;
struct Node {
    int value;
    Node* lchild;
    Node* rchild;
};
queue<Node*> Q;
void bfs(Node* pn) {
    if(pn == NULL) return;
    Q.push(pn);    
    while(!Q.empty()) {
        Node* t = Q.front();
        printf("%d ", t->value);
        if(t->lchild) {
            Q.push(t->lchild);
        }
        if(t->rchild) {
            Q.push(t->rchild);
        }
    }
}    
int main() {
    return 0;
}

或:

import java.util.*;
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {

        ArrayList<Integer> list =new ArrayList<Integer>();
        if(root==null) return list;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode t = queue.poll();
            list.add(t.val);
            if(t.left!=null) queue.add(t.left);
            if(t.right!=null) queue.add(t.right);
        }
        return list;
    }
}

有没有发现,都使用了队列或链表的结构, 其实没必要,只用数组就可以, 而且现代c/c++支持动态数组。

我用go写的。

package algorithm

import (
	"log"
	"errors"
)


func init(){
	bt := Btree{
		v:1,
		l: &Btree{
			v: 2,
			l: &Btree{
				v: 4,
				l: nil,
				r: &Btree{
					v: 5,
					l: nil,
					r: nil,
				},
			},
			r: nil,
		},
		r: &Btree{
			v: 3,
			l: nil,
			r: nil,
		},
	}
	printBtreeRow2(&bt)
	
}

func printBtreeRow2(btRoot *Btree) error {
	if nil == btRoot {
		return errors.New("invalid btRoot")
	}
	arr := []*Btree{btRoot}

	cntPTotal := 1
	for len(arr) >= cntPTotal {
		ele := arr[cntPTotal -1]
		if nil != ele.l {
			arr = append(arr, ele.l)
		}
		if nil != ele.r {
			arr = append(arr, ele.r)
		}
		cntPTotal += 1
		log.Println("row: ", ele.v)
	}
	return nil
}

 怎么样, 很清爽吧

 

谋胆并重
目录
相关文章
|
2月前
|
算法
《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
26 0
|
4月前
|
存储
【剑指offer】- 按之字形顺序打印二叉树-45/67
【剑指offer】- 按之字形顺序打印二叉树-45/67
|
10月前
|
存储 Java 测试技术
打印不重复的字符串全排列(递归)
本文将详细解析在生成不重复的字符串全排列时使用的Java代码。首先,我们将展示一个常规的全排列生成方法,然后介绍如何通过使用HashSet来跳过已经尝试过的字符,从而避免生成重复的全排列。最后,我们提供了一道相关的编程题目以供练习。
78 0
打印不重复的字符串全排列(递归)
|
10月前
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
88 0
|
存储 算法 C++
二维数组中的查找(两种解法,各有千秋)
二维数组中的查找(两种解法,各有千秋)
195 0
二维数组中的查找(两种解法,各有千秋)
|
存储 算法
打印N个数的循环算法和递归算法比较
打印N个数的循环算法和递归算法比较
|
算法
递归实现数字正序打印。(分析)
递归实现数字正序打印。(分析)
96 0
递归实现数字正序打印。(分析)
|
存储
【C】逆序字符串(俩种递归思路)
【C】逆序字符串(俩种递归思路)
61 0
【C】逆序字符串(俩种递归思路)
从上到下打印二叉树(简单难度)
从上到下打印二叉树(简单难度)
35 0
从上到下打印二叉树(简单难度)
从上到下打印二叉树 II(简单难度)
从上到下打印二叉树 II(简单难度)
50 0
从上到下打印二叉树 II(简单难度)