本文已参与「新人创作礼」活动,一起开启掘金创作之路
交换二叉树中每个结点的左孩子和右孩子
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式: 输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式: 输出有两行:
第一行是原二叉树的中序遍历序列; 第二行是交换后的二叉树的中序遍历序列。
输入样例: ABC##DE#G##F###
输出样例: CBEGDFA AFDGEBC
代码如下:
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
public class Main{
public static void main(String[] args) throws IOException {
BtNode btNode=createBiTree();
inorder(btNode);
exchange(btNode);
System.out.println();
inorder(btNode);
}
//构成二叉链表的结点类代码如下:
static class BtNode {
char data;
BtNode lchild, rchild;
}
//先序遍历序列建立二叉链表
public static BtNode createBiTree() throws IOException {
char c = (char) System.in.read();
if (c == '#') {
return null;
} else {
BtNode bt = new BtNode();
bt.data = c;
bt.lchild = createBiTree();
bt.rchild = createBiTree();
return bt;
}
}
public static Queue<BtNode> inorder(BtNode bt){ //中序遍历
Queue<BtNode> btNodeQueue=new LinkedList<>();
btNodeQueue.add(bt);
if (btNodeQueue.isEmpty()){
System.out.print("Tree is empty");
}
if (bt!=null){
inorder(bt.lchild);
System.out.print(bt.data);
inorder(bt.rchild);
}
return btNodeQueue;
}
public static void exchange(BtNode bt) { //交换左右结点
if (bt!=null){
exchange(bt.lchild);
exchange(bt.rchild);
BtNode tmp=bt.lchild;
bt.lchild= bt.rchild;
bt.rchild=tmp;
}
}
}