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
}

 怎么样, 很清爽吧

 

谋胆并重
目录
相关文章
|
7月前
|
算法
循环嵌套思路详解 | 一个“在盒子里过家家”的算法 -- 以冒泡排序与打印菱形为例(一)
本文介绍了编程中的一种思想,通过菱形打印问题来阐述如何理解和使用循环嵌套。文章提到,初学者在面对循环结构时,可以通过先识别代码块的结束括号来理解整体结构,提高阅读效率。作者提出了“在盒子里过家家”的理解思路,将外层循环看作一个个盒子,内层循环视为盒子里的操作,弱化循环嵌套的概念,强调以盒子为单位思考问题。此外,文章还通过示例解释了内外循环的关系,帮助读者更好地理解循环控制和执行过程。
114 3
|
7月前
|
算法
循环嵌套思路详解 | 一个“在盒子里过家家”的算法 -- 以冒泡排序与打印菱形为例(二)
本文介绍了如何运用特定思路解析和解决编程问题,特别是涉及双层循环的情况。首先,通过一个打印特定图案的例子,解释了将“盒子”作为思考单位的概念,即分析问题中每个循环的作用和内容。接着,以冒泡排序为例,展示了如何将问题分解为外层循环(趟数)和内层循环(每趟的比较与交换),并通过盒子思路简化理解和实现代码。最后,提到了菱形打印的代码优化,鼓励读者思考并应用这种思维方式。总的来说,文章强调了自然地理解和运用循环结构,而不是机械地记忆。
78 2
|
7月前
|
算法
《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
《剑指offer》之从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
53 0
|
7月前
|
存储 机器学习/深度学习 人工智能
嵌套for循环的九九乘法表——四个方向打印
嵌套for循环的九九乘法表——四个方向打印
152 0
|
7月前
|
算法 Java 定位技术
嵌套for循环的基础直角三角形——四个方向打印
嵌套for循环的基础直角三角形——四个方向打印
147 0
|
7月前
|
存储
【剑指offer】- 按之字形顺序打印二叉树-45/67
【剑指offer】- 按之字形顺序打印二叉树-45/67
链表翻转循环和递归写法(画图分析)
链表翻转循环和递归写法(画图分析)
35 0
剑指offer_递归与循环---矩形覆盖
剑指offer_递归与循环---矩形覆盖
85 0
剑指offer_递归与循环---斐波那契数列
剑指offer_递归与循环---斐波那契数列
70 0
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
208 0

热门文章

最新文章