程序员代码面试指南刷题--第三章.打印二叉树的边界节点

题目描述
给定一颗二叉树的根节点 root,按照如下两种标准分别实现二叉树的边界节点的逆时针打印。
标准一:
1,根节点为边界节点。
2,叶节点为边界节点。
3,如果节点在其所在的层中是最左的或最右的,那么该节点也是边界节点。
标准二:
1,根节点为边界节点。
2,叶节点为边界节点。
3,树左边界延伸下去的路径为边界节点。
4,树右边界延伸下去的路径为边界节点。
ps:具体请对照样例
输入描述:

第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。
以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa 没有左儿子,rch同理)

输出描述:

输出两行整数分别表示按两种标准的边界节点。

示例1

输入

16 1
1 2 3
2 0 4
4 7 8
7 0 0
8 0 11
11 13 14
13 0 0
14 0 0
3 5 6
5 9 10
10 0 0
9 12 0
12 15 16
15 0 0
16 0 0
6 0 0

输出

1 2 4 7 11 13 14 15 16 12 10 6 3
1 2 4 7 13 14 15 16 10 6 3

解法一:太恶心了吧

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args)throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] ss = br.readLine().trim().split(" ");
        int len = Integer.parseInt(ss[0]);
        int rootnum = Integer.parseInt(ss[1]);
        TreeNode[] nodes = new TreeNode[len+1];
        for(int i=1;i<=len;i++){
            nodes[i] = new TreeNode(i);
        }
        for(int i=0;i<len;i++){
            String[] arr = br.readLine().trim().split(" ");
            int data = Integer.parseInt(arr[0]);
            int left = Integer.parseInt(arr[1]);
            int right = Integer.parseInt(arr[2]);
            nodes[data].left = nodes[left];
            nodes[data].right = nodes[right];
        }
        TreeNode root = nodes[rootnum];
        fun1(root); //标准一
        StringBuilder sb = new StringBuilder();
        fun2(root,sb); //标准二
        System.out.println(sb.toString().trim());
    }
    public static void fun2(TreeNode root,StringBuilder sb){
        if(root==null) return;
        sb.append(root.val+" ");
        if(root.left!=null&&root.right!=null){
            printleft(root.left,true,sb);
            printright(root.right,true,sb);
        }else{
            fun2(root.left==null?root.right:root.left,sb);
        }
    }
    public static void printleft(TreeNode root,boolean flag,StringBuilder sb){
        if(root==null) return ;
        if(flag||(root.left==null&&root.right==null)){
            sb.append(root.val+" ");
        }
        printleft(root.left,flag,sb);
        printleft(root.right,flag&&(root.left==null),sb);
    }
    public static void printright(TreeNode root,boolean flag,StringBuilder sb){
        if(root==null) return;
        printright(root.left,flag&&(root.right==null),sb);
        printright(root.right,flag,sb);
        if(flag||(root.left==null&&root.right==null)){
            sb.append(root.val+" ");
        }
    }
    public static void fun1(TreeNode root){
        if(root==null) return;
        int height = treeHeight(root);
        TreeNode[][] res = new TreeNode[height][2];
        edgeNode(root,res,0);
        StringBuilder sb = new StringBuilder();
        //左边
        for(int i=0;i<height;i++){
            sb.append(res[i][0].val+" ");
        }
        //中间
        midNode(root,res,0,sb);
        for(int i=height-1;i>=0;i--){
            if(res[i][0]!=res[i][1]){
                sb.append(res[i][1].val+" ");
            }
        }
        System.out.println(sb.toString().trim());
    }
    public static void midNode(TreeNode root,TreeNode[][] res,int l,StringBuilder sb){
        if(root==null) return;
        if(root.left==null&&root.right==null&&res[l][0]!=root&&res[l][1]!=root){
            sb.append(root.val+" ");
        }
        midNode(root.left,res,l+1,sb);
        midNode(root.right,res,l+1,sb);
    }
    public static void edgeNode(TreeNode root,TreeNode[][] res,int l){
        if(root==null) return;
        res[l][0] = res[l][0]==null?root:res[l][0];
        res[l][1] = root;
        edgeNode(root.left,res,l+1);
        edgeNode(root.right,res,l+1);
    }
    //树高
    public static int treeHeight(TreeNode root){
        if(root==null) return 0;
        return Math.max(treeHeight(root.left)+1,treeHeight(root.right)+1);
    }
    //递归建树艹这题不得行
    public static TreeNode createTree(BufferedReader br){
        try{
            String[] ss = br.readLine().trim().split(" ");
            int data = Integer.parseInt(ss[0]);
            int left = Integer.parseInt(ss[1]);
            int right = Integer.parseInt(ss[2]);
            TreeNode root = new TreeNode(data);
            if(left!=0){
                root.left = createTree(br);
            }
            if(right!=0){
                root.right = createTree(br);
            }
            return root;
        }catch(Exception e){
            return null;
        }
    }
}
class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int val){
        this.val = val;
    }
}

你可能感兴趣的:(程序员代码面试指南刷题)