交换二叉树中每个结点的左孩子和右孩子(先序建树,中序遍历输出,交换后中序输出)——java数据结构

383 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

交换二叉树中每个结点的左孩子和右孩子

以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。

输入格式: 输入二叉树的先序序列。

提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

输出格式: 输出有两行:

第一行是原二叉树的中序遍历序列; 第二行是交换后的二叉树的中序遍历序列。

输入样例: 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;
        }
    }
}