数据结构之二叉树

目录

一、什么是二叉树?

二、二叉树的作用

三、二叉树遍历

1.前序遍历

以下是前序遍历的递归代码:

以下是前序遍历的非递归代码:

2.中序遍历

以下是中序遍历的递归代码:

以下是中序遍历的非递归代码:

3.后序遍历

以下是后序遍历的递归代码:

以下是后序遍历的非递归代码:

四、总结


一、什么是二叉树?

二叉树是一种数据结构,由节点和边构成,每个节点最多有两个子节点。根节点没有父节点,每个叶子节点都没有子节点。二叉树通常用于快速查找和排序数据。

二、二叉树的作用

二叉树有很多应用,包括在计算机科学、数学、语言学、生物学等领域。在计算机科学中,二叉树通常用于快速查找和排序数据。例如,在操作系统中,文件系统通常使用二叉树来组织文件和文件夹。在计算机网络中,路由表也通常使用二叉树来快速查找路由信息。

三、二叉树遍历

二叉树的遍历是指按照一定的顺序访问二叉树中的每个节点。常用的遍历方式有前序遍历、中序遍历和后序遍历。

1.前序遍历

前序遍历是指先访问根节点,然后按照先左后右的顺序访问左右子树。

以下是前序遍历的递归代码:

void preorder(Node* root) {
    if (root == nullptr) {
        return;
    }
    std::cout << root->val << " ";
    preorder(root->left);
    preorder(root->right);
}

以下是前序遍历的非递归代码:

void preorder(Node* root) {
    if (root == nullptr) {
        return;
    }
    std::stack<Node*> stack;
    stack.push(root);
    while (!stack.empty()) {
        Node* node = stack.top();
        stack.pop();
        std::cout << node->val << " ";
        if (node->right != nullptr) {
            stack.push(node->right);
        }
        if (node->left != nullptr) {
            stack.push(node->left);
        }
    }
}

2.中序遍历

中序遍历是指先访问左子树,然后访问根节点,最后访问右子树。

以下是中序遍历的递归代码:

void inorder(Node* root) {
    if (root == nullptr) {
        return;
    }
    inorder(root->left);
    std::cout << root->val << " ";
    inorder(root->right);
}

以下是中序遍历的非递归代码:

void inorder(Node* root) {
    if (root == nullptr) {
        return;
    }
    std::stack<Node*> stack;
    Node* node = root;
    while (node != nullptr || !stack.empty()) {
        while (node != nullptr) {
            stack.push(node);
            node = node->left;
        }
        node = stack.top();
        stack.pop();
        std::cout << node->val << " ";
        node = node->right;
    }
}

3.后序遍历

后序遍历是指先访问左右子树,最后访问根节点。

以下是后序遍历的递归代码:

void postorder(Node* root) {
    if (root == nullptr) {
        return;
    }
    postorder(root->left);
    postorder(root->right);
    std::cout << root->val << " ";
}

以下是后序遍历的非递归代码:

void postorder(Node* root) {
    if (root == nullptr) {
        return;
    }
    std::stack<Node*> stack1, stack2;
    stack1.push(root);
    while (!stack1.empty()) {
        Node* node = stack1.top();
        stack1.pop();
        stack2.push(node);
        if (node->left != nullptr) {
            stack1.push(node->left);
        }
        if (node->right != nullptr) {
            stack1.push(node->right);
        }
    }
    while (!stack2.empty()) {
        Node* node = stack2.top();
        stack2.pop();
        std::cout << node->val << " ";
    }
}

四、总结

二叉树是一种重要的数据结构,在计算机科学中有广泛的应用。二叉树遍历是访问二叉树中每个节点的常用方式,常见的遍历方式包括前序遍历、中序遍历和后序遍历。在实现二叉树遍历时,递归和非递归方法都可以使用。在编写二叉树相关的代码时,需要注意指针的使用和空节点的处理。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值