题目描述
给定一颗二叉树的根节点 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;
}
}