由于保证每个内部节点恰好有 2 个子节点,我们可以简单地使用它递归地构建树。
我们使用提供的输入调用我们的函数,它会检查它得到的第一个字符。如果它是一个叶子节点,它只返回一个叶子。如果是内部节点,只调用左右子树,返回以该节点为根,左右子树为左右子节点形成的树。
代码如下(在 Python 中)。注意,我使用tuples 表示节点,所以树是tuple 的tuples。
#! /usr/bin/env python
from collections import deque
def build_tree(pre_order):
root=pre_order.popleft()
if root=='L':
return root
else:
return (root,build_tree(pre_order),build_tree(pre_order))
if __name__=='__main__':
print build_tree(deque("NNLLL"))
编辑:Java 代码
import java.util.*;
class Preorder{
public static Node buildTree(List<Character> preorder){
char token=preorder.remove(0);
if (token=='L'){
return new Node(token,null,null);
}
else{
return new Node(token,buildTree(preorder),buildTree(preorder));
}
}
public static void main(String args[]){
List<Character> tokens=new LinkedList<Character>();
String input="NNLLL";
for(int i=0;i<input.length();i++) tokens.add(input.charAt(i));
System.out.println(buildTree(tokens));
}
}
class Node{
char value;
Node left,right;
public Node(char value, Node left, Node right){
this.value=value;
this.left=left;
this.right=right;
}
public String toString(){
if (left==null && right==null){
return "("+value+")";
}
else{
return "("+value+", "+left+", "+right+")";
}
}
}