二叉树的创建与遍历

二叉树创建

创建根据数组,值为0代表空节点

    private static Node createTree(int[] data, int index) {
        if (index >= data.length || data[index] == 0) {
            return null;
        }
        Node node = new Node();
        node.setValue(data[index]);
        node.setLeftChild(createTree(data, 2 * index + 1));
        node.setRightChild(createTree(data, 2 * index + 2));
        return node;
    }

createTree是创建以index索引代表节点为root的树,所以我们首先创建节点赋上对应值,然后设置左右子树,通过递归,最后得到二叉树。

二叉树的深度优先遍历的递归算法

深度优先遍历还分为先序、中序、后序。以先序为例,先序就是先访问根节点,再先序遍历左子树,然后先序遍历右子树,很明显可以递归完成。

    /**
     * 先序
     * @param root
     */
    private static void preOrder(Node root) {
        if (root != null) {
            System.out.println(root.getValue() + "");
            preOrder(root.getLeftChild());
            preOrder(root.getRightChild());
        }
    }

    /**
     * 中序
     * @param root
     */
    private static void inOrder(Node root) {
        if (root != null) {
            preOrder(root.getLeftChild());
            System.out.println(root.getValue() + "");
            preOrder(root.getRightChild());
        }
    }

    /**
     * 后序 
     * @param root
     */
    private static void postOrder(Node root) {
        if (root != null) {
            preOrder(root.getLeftChild());
            preOrder(root.getRightChild());
            System.out.println(root.getValue() + "");
        }
    }

二叉树的深度优先遍历的非递归算法

先序

非递归方法我们使用栈来实现

    /**
     * 先序非递归
     * @param node
     */
    private static void pre(Node node) {
        if (node == null) {
            return;
        }
        ArrayDeque<Node> stack = new ArrayDeque<>();
        stack.push(node);
        while (!stack.isEmpty()) {
            Node n = stack.pop();
            System.out.println(n.getValue() + "");
            if (n.getRightChild() != null) {
                stack.push(n.getRightChild());
            }
            if (n.getLeftChild() != null) {
                stack.push(n.getLeftChild());
            }
        }
    }

首先root入栈,然后循环访问栈顶元素并出栈,接下来将左右子节点入栈,入栈顺序要是先右后左。

二叉树的广度优先遍历

我们可以通过一个队列来保存访问过的节点的左右子节点,然后删除访问过的节点,直到队列为空

    private static void layer(Node root) {
        if (root == null) {
            return;
        }
        List<Node> nodeQueue = new ArrayList<Node>();
        nodeQueue.add(root);
        while (nodeQueue.size() != 0) {
            Node node = nodeQueue.remove(0);
            System.out.println(node.getValue() + "");
            if (node.getLeftChild() != null) {
                nodeQueue.add(node.getLeftChild());
            }
            if (node.getRightChild() != null) {
                nodeQueue.add(node.getRightChild());
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的二叉树创建遍历的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 创建二叉树 TreeNode* createTree() { int val; printf("请输入节点的值(输入 -1 表示该节点为空):"); scanf("%d", &val); if (val == -1) { return NULL; } // 创建新节点 TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = val; // 递归创建左右子树 printf("创建节点 %d 的左子树:\n", val); node->left = createTree(); printf("创建节点 %d 的右子树:\n", val); node->right = createTree(); return node; } // 前序遍历 void preOrder(TreeNode* node) { if (node == NULL) { return; } printf("%d ", node->val); preOrder(node->left); preOrder(node->right); } // 中序遍历 void inOrder(TreeNode* node) { if (node == NULL) { return; } inOrder(node->left); printf("%d ", node->val); inOrder(node->right); } // 后序遍历 void postOrder(TreeNode* node) { if (node == NULL) { return; } postOrder(node->left); postOrder(node->right); printf("%d ", node->val); } int main() { TreeNode* root = createTree(); printf("前序遍历结果:"); preOrder(root); printf("\n"); printf("中序遍历结果:"); inOrder(root); printf("\n"); printf("后序遍历结果:"); postOrder(root); printf("\n"); return 0; } ``` 该代码可以让用户输入二叉树的节点值,递归地创建左右子树,并按照前序、中序、后序遍历的顺序输出二叉树节点的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值