首先空的节点在数组中用#号表示。
思路:
1.把树从根左右的顺序从0开始标号。那么第i号节点的左孩子的标号是2*i+1,右孩子是2*i+2。
2.程序上实现标号:
即创建一个TreeList类型的List记作nodeList,
List<TreeNode> nodeList = new ArrayList<TreeNode>();
再把数组中的元素按顺序放进去:
for(int i = 0;i < arr.size();i++){
if((String)arr.get(i) != "#"){
nodeList.add(new TreeNode((String)arr.get(i)));}
else{
nodeList.add(null);
}
}
这样就能够按标号找到节点,接下来只需要把每个有孩子的节点连上其孩子即可,而孩子很容易通过标号找到在数组中找到。
剩下的就是一些细节问题,比如数组越界的处理,还有遍历到空节点要继续向下遍历到非空。直接贴代码了。
public static TreeNode createTree(List<String> arr){
List<TreeNode> nodeList = new ArrayList<TreeNode>();
if(arr == null){
return null;
}
else{
for(int i = 0;i < arr.size();i++){
if((String)arr.get(i) != "#"){
nodeList.add(new TreeNode((String)arr.get(i)));
}
else{
nodeList.add(null);
}
}
int i = 0;
while(i <= arr.size()/2-1){
int l = 2*i+1;
int r = 2*i+2;
while((String)arr.get(i) == "#"){
i++;
}
if(l<arr.size() && arr.get(l) != null && (String)arr.get(i) != "#"){
nodeList.get(i).left = nodeList.get(l);
}
else{
nodeList.get(i).left = null;
}
if(r<arr.size() && arr.get(r) != null && (String)arr.get(i) != "#"){
nodeList.get(i).right = nodeList.get(r);
}
else{
nodeList.get(i).right = null;
}
i++;
}
return nodeList.get(0);
}
}
最后为了解决很烦的类型问题,把所有二叉树节点都设置成String型的了。
还有主函数里用Arrrays.asList()方法把数组转成List型。就不用一个个add了。
String []arr1 = {"8","7","5","6","9","#","8"};
List<String> arr = Arrays.asList(arr1);
完整代码:
package exercise1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public static void Mirror(TreeNode root) {
if(root == null){
return;
}
else if(root.left != null || root.right != null){
TreeNode left = root.left;
root.left = root.right;
root.right = left;
if(root.left != null){
Mirror(root.left);
}
if(root.right != null){
Mirror(root.right);
}
}
}
public static void preOrderTraver(TreeNode node) {
if (null != node) {
System.out.println("node:" + node.val);
preOrderTraver(node.left);
preOrderTraver(node.right);
} else {
System.out.println("树为空");
return;
}
}
public static TreeNode createTree(List<String> arr){
List<TreeNode> nodeList = new ArrayList<TreeNode>();
if(arr == null){
return null;
}
else{
for(int i = 0;i < arr.size();i++){
if((String)arr.get(i) != "#"){
nodeList.add(new TreeNode((String)arr.get(i)));
}
else{
nodeList.add(null);
}
}
int i = 0;
while(i <= arr.size()/2-1){
int l = 2*i+1;
int r = 2*i+2;
while((String)arr.get(i) == "#"){
i++;
}
if(l<arr.size() && arr.get(l) != null && (String)arr.get(i) != "#"){
nodeList.get(i).left = nodeList.get(l);
}
else{
nodeList.get(i).left = null;
}
if(r<arr.size() && arr.get(r) != null && (String)arr.get(i) != "#"){
nodeList.get(i).right = nodeList.get(r);
}
else{
nodeList.get(i).right = null;
}
i++;
}
return nodeList.get(0);
}
}
public static void main(String[] args) {
String []arr1 = {"8","7","5","6","9","#","8"};
List<String> arr = Arrays.asList(arr1);
List<String> arr2 = null;
TreeNode node = createTree(arr2);
Mirror(node);
preOrderTraver(node);
}
}