二叉树

浪子不回头ぞ 提交于 2019-12-10 15:18:46

先看一些基本概念

1.结点的度

结点拥有的子树数目称为结点的度

2.二叉树

结点的度最大为2,而且左子树和右子树是有顺序的,不能随意改变

3.广义表创建二叉树:

广义表的的约定如下:

1.表中的一个字母表示一个结点的数据信息

2.每个结点的左子树与右子树之间用逗号隔开;如果只有右子树而无左子树,则逗号不能省略。左右子树存在于括号中

A(B(C(,E),D),F(G,))表示的树为:

首先分析算法的过程:

1)遇到(,则说明前一个结点一定是父节点,而且接下来处理的是左结点

2)遇到,则说明即将处理右节点

3)遇到)说明一颗子树已处理完

4)遇到字母,则表示是一个结点

代码如下:

//先创建二叉树:
public class BinaryTree {
    private String data;
    private BinaryTree left;
    private BinaryTree right;
    
    public BinaryTree(String data) {
        this.data = data;
    }

    public BinaryTree() {
    }
	
	//get、set省略
}

广义表创建二叉树:

//广义表初始化树
 public BinaryTree init(String s) {
        BinaryTree root = null;  //根节点
        BinaryTree node = null;  //当前结点
        char c;
        Stack stack = new Stack();
        int k = 0; //1表示左子树,2表示右子树

        for (int i = 0; i < s.length(); i++) {
            c = s.charAt(i);
            if (c == '(') {
                stack.push(node);
                k = 1;
            } else if (c == ',') {
                k = 2;
            } else if (c == ')') {
                node = (BinaryTree) stack.pop();
            } else {
                node = new BinaryTree(String.valueOf(c));
                if (null == root) {
                    root = node;
                }else {
                    BinaryTree temp = (BinaryTree) stack.peek();
                    if (k == 1) {
                        temp.setLeft(node);
                    }
                    if (k == 2) {
                        temp.setRight(node);
                    }
                }
            }
        }
        return root;
    }
	
	//树的中序打印
	  private void midPrint(BinaryTree root) {
        if (root == null) {
            return;
        }
        midPrint(root.left);
        System.out.println(root.getData());
        midPrint(root.right);
    }
	
	 public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        binaryTree = binaryTree.init("A(B(C(,E),D),F(G,))");
        binaryTree.midPrint(binaryTree);
    }

打印结果:

Connected to the target VM, address: '127.0.0.1:51015', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:51015', transport: 'socket'
C
E
B
D
A
G
F

Process finished with exit code 0

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!