本帖最后由 小蜀哥哥 于 2019-8-1 17:40 编辑1.二叉树的遍历算法 二叉树的遍历主要分为三种:先序遍历,中序遍历和后序遍历。还有一种就是按照层次遍历。 按照惯例,左孩子优先于右孩子,那么: 先序遍历指的就是先访问本节点,再访问该节点的左孩子和右孩子; 中序遍历指的就是:先访问左孩子,再访问本节点,最后访问右孩子; 后序遍历指的就是:先访问左右孩子,最后访问本节点。 层次遍历:按照树的每一层(高度)进行遍历。树的节点的数据结构常声明为: [Java] 纯文本查看 复制代码 ? 1 2 3 4 5 6 struct TreeNode { int val; TreeNode *left; //左孩子节点 TreeNode *right; //右孩子节点 TreeNode( int x) : val(x), left(NULL), right(NULL) {} } 约定给出根节点,分别使用三种遍历方式得到二叉树的序列:得益于递归的简洁性,三种遍历方式的递归算法也是非常简洁和易懂的。(1). 先序遍历 [Java] 纯文本查看 复制代码 ? 1 2 3 4 5 6 7 //递归版本 void preOrderTraversal(vector< int > &store, TreeNode *root) { if (!root) return ; store.push_back(root->val); preOrderTraversal(store, root->left); //左孩子优先 preOrderTraversal(store, root->right); } 先序遍历的理解:沿着最左侧通路自顶而下访问各个节点,自底而上遍历对应的右子树。迭代版本需要用到栈这种数据结构。 [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 //递归版本 void preOrderTraversal(vector< int > &store, TreeNode *root) { stack<TreeNode *> S; S.push(root); while (!S.empty()) { TreeNode *curr_node = S.top(); S.pop(); if (curr_node) { store.push_back(curr_node->val); S.push(curr_node->right); //左孩子优先,所以右孩子先入栈 S.push(curr_node->left); } } return ; } (2). 中序遍历 [Java] 纯文本查看 复制代码 ? 1 2 3 4 5 6 7 8 //递归版本 void inOrderTraversal(vector< int > &store, TreeNode *root) { if (!root) return ; inOrderTraversal(store, root->left); store.push_back(root->val); inOrderTraversal(store, root->right); return ; } 中序遍历的迭代版本需要借用一个数据结构:栈,使用一个栈来保存,根节点沿着左通路一直往下访问的节点。 [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06