二叉树前序中序后序

前序遍历:根节点排最先,然后同级先左后右

中序遍历:先左后根最后右

后序遍历:先左后右最后根

层次遍历:按层次遍历即可

比如上图二叉树遍历结果

    前序遍历:ABCDEFGHK

    中序遍历:BDCAEHGKF

    后序遍历:DCBHKGFEA

    层次遍历:ABECFDGHK

主要分析中序遍历:

可以已知中序和前序或中序和后续求出另外一个。

领扣题:已知前序和中序求二叉树

代码拷贝自大佬博客:https://blog.youkuaiyun.com/woxiaohahaa/article/details/52744072

class Solution {
public:
    TreeNode* buildSubTree(vector<int>& preorder, vector<int>& inorder, int posPre, int posIn, int len) {
        if(0 == len) return NULL;

        int leftLen, rightLen;
        vector<int>::iterator rootPos = find(inorder.begin(), inorder.end(), preorder[posPre]);
        leftLen = rootPos - (inorder.begin() + posIn);
        rightLen = len - 1 - leftLen;
        TreeNode *root = new TreeNode(preorder[posPre]);
        root -> left = buildSubTree(preorder, inorder, posPre + 1, posIn, leftLen);
        root -> right = buildSubTree(preorder, inorder, posPre + 1 + leftLen, posIn + 1 + leftLen, rightLen);
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size() != inorder.size()) return NULL;
        if(0 == preorder.size()) return NULL; 
        return buildSubTree(preorder, inorder, 0, 0, preorder.size());
    }
};

 

### C++中关于二叉树前序、中后序遍历的示例代码 以下内容提供了C++实现二叉树前序、中后序遍历的完整代码示例,包括递归和非递归两种方法。 --- #### 1. 递归实现前序、中后序遍历 递归实现是最常见的方法之一,其核心思想是通过函数调用栈来实现对二叉树节点的访问。 ```cpp #include <iostream> using namespace std; // 定义二叉树节点结构 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 前序遍历(递归) void preOrder(TreeNode* root) { if (root == nullptr) return; cout << root->val << " "; // 访问根节点 preOrder(root->left); // 递归遍历左子树 preOrder(root->right); // 递归遍历右子树 } // 中遍历(递归) void inOrder(TreeNode* root) { if (root == nullptr) return; inOrder(root->left); // 递归遍历左子树 cout << root->val << " "; // 访问根节点 inOrder(root->right); // 递归遍历右子树 } // 后序遍历(递归) void postOrder(TreeNode* root) { if (root == nullptr) return; postOrder(root->left); // 递归遍历左子树 postOrder(root->right); // 递归遍历右子树 cout << root->val << " "; // 访问根节点 } ``` 上述代码展示了如何使用递归方式实现二叉树前序、中后序遍历[^2]。 --- #### 2. 非递归实现前序、中后序遍历 非递归实现通常需要借助显式栈来模拟函数调用栈的行为。 ##### (1) 非递归前序遍历 ```cpp #include <stack> void preOrderIterative(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> s; s.push(root); while (!s.empty()) { TreeNode* node = s.top(); s.pop(); cout << node->val << " "; // 访问根节点 if (node->right) s.push(node->right); // 右子树入栈 if (node->left) s.push(node->left); // 左子树后入栈 } } ``` ##### (2) 非递归中遍历 ```cpp void inOrderIterative(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> s; TreeNode* p = root; while (p != nullptr || !s.empty()) { while (p != nullptr) { s.push(p); // 将当前节点压入栈 p = p->left; // 移动到左子树 } if (!s.empty()) { p = s.top(); // 弹出栈顶元素 s.pop(); cout << p->val << " "; // 访问根节点 p = p->right; // 移动到右子树 } } } ``` ##### (3) 非递归后序遍历 后序遍历的非递归实现稍复杂,需要借助两个栈或标记法。 ```cpp void postOrderIterative(TreeNode* root) { if (root == nullptr) return; stack<TreeNode*> s1, s2; s1.push(root); while (!s1.empty()) { TreeNode* node = s1.top(); s1.pop(); s2.push(node); // 第二个栈用于反转输出顺 if (node->left) s1.push(node->left); if (node->right) s1.push(node->right); } while (!s2.empty()) { cout << s2.top()->val << " "; s2.pop(); } } ``` 上述代码展示了如何使用非递归方式实现二叉树前序、中后序遍历[^4]。 --- ### 示例运行 假设构建如下二叉树: ``` 1 / \ 2 3 / \ \ 4 5 6 ``` 构建代码: ```cpp TreeNode* buildTree() { 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->right = new TreeNode(6); return root; } int main() { TreeNode* root = buildTree(); cout << "前序遍历: "; preOrder(root); cout << endl; cout << "中遍历: "; inOrder(root); cout << endl; cout << "后序遍历: "; postOrder(root); cout << endl; return 0; } ``` 输出结果为: ``` 前序遍历: 1 2 4 5 3 6 中遍历: 4 2 5 1 3 6 后序遍历: 4 5 2 6 3 1 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值