二叉树系列主题Code

13 篇文章 0 订阅
12 篇文章 0 订阅

Python实现二叉树遍历

# 定义二叉树节点类  
class TreeNode:  
    def __init__(self, val=0, left=None, right=None):  
        self.val = val  
        self.left = left  
        self.right = right  
  
# 前序遍历(非递归)  
def preorderTraversal(root):  
    if not root:  
        return []  
    stack, output = [root], []  
    while stack:  
        node = stack.pop()  
        if node:  
            output.append(node.val)  
            if node.right:  
                stack.append(node.right)  
            if node.left:  
                stack.append(node.left)  
    return output  
  
# 中序遍历(非递归)  
def inorderTraversal(root):  
    stack, output, current = [], [], root  
    while True:  
        while current:  
            stack.append(current)  
            current = current.left  
        if not stack:  
            return output  
        current = stack.pop()  
        output.append(current.val)  
        current = current.right  
  
# 后序遍历(非递归)  
def postorderTraversal(root):  
    if not root:  
        return []  
    stack1, stack2, output = [root], [], []  
    while stack1:  
        node = stack1.pop()  
        if node:  
            stack2.append(node)  
            if node.left:  
                stack1.append(node.left)  
            if node.right:  
                stack1.append(node.right)  
    while stack2:  
        node = stack2.pop()  
        output.append(node.val)  
    return output[::-1]  # 逆序输出,得到后序遍历结果  
  
# 层次遍历(非递归)  
def levelOrderTraversal(root):  
    if not root:  
        return []  
    from collections import deque  
    queue, output = deque([root]), []  
    while queue:  
        level_size = len(queue)  
        current_level = []  
        for _ in range(level_size):  
            node = queue.popleft()  # 弹出队列左侧元素  
            current_level.append(node.val)  
            if node.left:  
                queue.append(node.left)  # 左孩子入队  
            if node.right:  
                queue.append(node.right)  # 右孩子入队  
        output.append(current_level)  
    return output

cpp实现二叉树遍历

#include <iostream>  
#include <stack>  
#include <queue>
using namespace std;  
  
// 二叉树节点定义  
struct TreeNode {  
    int val;  
    TreeNode* left;  
    TreeNode* right;  
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}  
};  
  
// 前序遍历(递归实现)  
void preorderTraversalRecursive(TreeNode* root) {  
    if (root == NULL) {  
        return;  
    }  
    cout << root->val << " ";  
    preorderTraversalRecursive(root->left);  
    preorderTraversalRecursive(root->right);  
}  
  
// 前序遍历(迭代实现)  
void preorderTraversalIterative(TreeNode* root) {  
    if (root == NULL) {  
        return;  
    }  
    stack<TreeNode*> stk;  
    stk.push(root);  
    while (!stk.empty()) {  
        TreeNode* node = stk.top();  
        stk.pop();  
        cout << node->val << " ";  
        if (node->right != NULL) {  
            stk.push(node->right);  
        }  
        if (node->left != NULL) {  
            stk.push(node->left);  
        }  
    }  
}  
  
// 中序遍历(递归实现)  
void inorderTraversalRecursive(TreeNode* root) {  
    if (root == NULL) {  
        return;  
    }  
    inorderTraversalRecursive(root->left);  
    cout << root->val << " ";  
    inorderTraversalRecursive(root->right);  
}  
  
// 中序遍历(迭代实现)  
void inorderTraversalIterative(TreeNode* root) {  
    if (root == NULL) {  
        return;  
    }  
    stack<TreeNode*> stk;  
    TreeNode* curr = root;  
    while (curr != NULL || !stk.empty()) {  
        while (curr != NULL) {  
            stk.push(curr);  
            curr = curr->left;  
        }  
        curr = stk.top();  
        stk.pop();  
        cout << curr->val << " ";  
        curr = curr->right;  
    }  
}  
  
// 后序遍历(递归实现)  
void postorderTraversalRecursive(TreeNode* root) {  
    if (root == NULL) {  
        return;  
    }  
    postorderTraversalRecursive(root->left);  
    postorderTraversalRecursive(root->right);  
    cout << root->val << " ";  
}  
  
// 后序遍历(迭代实现)  
void postorderTraversalIterative(TreeNode* root) {  
    if (root == NULL) {  
        return;  
    }  
    stack<TreeNode*> stk1, stk2;  
    stk1.push(root);  
    while (!stk1.empty()) {  
        TreeNode* node = stk1.top();  
        stk1.pop();  
        stk2.push(node);  
        if (node->left != NULL) {  
            stk1.push(node->left);  
        }  
        if (node->right != NULL) {  
            stk1.push(node->right);  
        }  
    }  
    while (!stk2.empty()) {  
        cout << stk2.top()->val << " ";  
        stk2.pop();  
    }  
}  
  // 层次遍历  
void levelOrderTraversal(TreeNode* root) {  
    if (root == NULL) {  
        return;  
    }  
    queue<TreeNode*> q;  
    q.push(root);  
    while (!q.empty()) {  
        int levelSize = q.size();  
        for (int i = 0; i < levelSize; i++) {  
            TreeNode* node = q.front();  
            q.pop();  
            cout << node->val << " ";  
            if (node->left != NULL) {  
                q.push(node->left);  
            }  
            if (node->right != NULL) {  
                q.push(node->right);  
            }  
        }  
        cout << endl; // 每一层遍历完后换行  
    }  
    
int main() {  
    // 创建二叉树  
    TreeNode* root = new TreeNode(1);  
    root->left = new TreeNode(2);  
    root->right = new TreeNode(3);  
    root->left->left = new TreeNode(4);  
    root->left->right = new TreeNode(5);  
    root->right->left = new TreeNode(6);  
    root->right->right = new TreeNode(7);  
    cout << "前序遍历(递归实现): ";  
    preorderTraversalRecursive(root); cout << endl; // 输出:1 2 4 5 3 6 7
}

水平有限,有问题随时联系~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值