数据结构-构建查找二叉树--先序遍历转化成二叉树

查找二叉树,就是每个节点的左孩子都比本身小,并且右孩子比本身大。这样就构成了一个有序的二叉树。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
//        foo1();
    foo2();
    }

//构建查找二叉树,就是将数据构建二分法的二叉树
private void foo2() {
    TreeNode1 rootNode = putSearchTree(53, null);
    putSearchTree(27, rootNode);
    putSearchTree(20, rootNode);
    putSearchTree(90, rootNode);
    putSearchTree(77, rootNode);
    putSearchTree(67, rootNode);
    putSearchTree(80, rootNode);
    putSearchTree(30, rootNode);
    putSearchTree(12, rootNode);
    putSearchTree(25, rootNode);
    preBinaryNode1(rootNode);
}

private TreeNode1 putSearchTree(int data, TreeNode1 parentNode) {

    if (parentNode == null) {
        parentNode = new TreeNode1(data);
        return parentNode;
    }
    TreeNode1 rootNode = parentNode;
    //放在左子树
    if (data < parentNode.data) {
        parentNode.leftChild = putSearchTree(data, parentNode.leftChild);
        //右子树
    } else if (data > parentNode.data) {
        parentNode.rightChild = putSearchTree(data, parentNode.rightChild);
        //如果数值相等
    } else {
        return rootNode;
    }
    return rootNode;
}

private void preBinaryNode1(TreeNode1 node) {
    if (node != null) {
        Log.e("TAG", "先序遍历==" + node.data);
        preBinaryNode1(node.leftChild);
        preBinaryNode1(node.rightChild);
    }
}

//将先序遍历转化成二叉树
private void foo1() {
    ArrayList<String> strings = new ArrayList<>();
    strings.add("A");
    strings.add("B");
    strings.add("D");
    strings.add("#");
    strings.add("#");
    strings.add("E");
    strings.add("#");
    strings.add("#");
    strings.add("C");
    strings.add("F");
    strings.add("#");
    strings.add("#");
    strings.add("G");
    strings.add("#");
    strings.add("H");
    strings.add("#");
    strings.add("#");

    TreeNode binaryNode = createBinaryNode(0, strings);
    preBinaryNode(binaryNode);

}

//    将先序遍历转化成二叉树
private TreeNode createBinaryNode(int index, ArrayList<String> strings) {
    if (strings.size() <= 0) {
        return null;
    }
    TreeNode treeNode;
    if ("#".equals(strings.get(0))) {
        //遇见终止符要进行删除,否则就会一直在这判断
        strings.remove(0);
        return null;
    }
    //其他的都要进行创建节点
    treeNode = new TreeNode(strings.get(0));
    strings.remove(0);
    Log.e("TAG", "index===" + index);
    treeNode.leftChild = createBinaryNode(++index, strings);
    treeNode.rightChild = createBinaryNode(++index, strings);
    return treeNode;
}

private void preBinaryNode(TreeNode node) {
    if (node != null) {
        Log.e("TAG", "先序遍历==" + node.data);
        preBinaryNode(node.leftChild);
        preBinaryNode(node.rightChild);
    }
}

class TreeNode1 {
    public int data;
    public TreeNode1 leftChild = null;
    public TreeNode1 rightChild = null;

    public TreeNode1(int data) {
        this.data = data;
    }
}

class TreeNode {
    public String data;
    public TreeNode leftChild;
    public TreeNode rightChild;

    public TreeNode(String data) {
        this.data = data;
    }
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值