老解法:
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 }
怎么样, 很清爽吧