二叉树的遍历
二叉树的前序遍历:
(1)基本原理:首先访问当前节点,然后遍历左子树,最后遍历右子树。
(2)代码实现:
void preordertravel(vector<int> & vi, TreeNode *root) { if(root == NULL) return; vi.push_back(root->val); cout<<root->val; preordertravel(vi,root->left); preordertravel(vi,root->right); }
二叉树的中序遍历:
(1)基本原理:首先遍历左子树,然后访问当前节点,最后遍历右子树。
(2)代码实现:
/*递归的中序遍历*/ void inordertravel(vector<int> & vi, TreeNode * root) { if(root == NULL) //递归结束的边界条件 return; inordertravel(vi,root->left); cout<<root->val; vi.push_back(root->val); inordertravel(vi,root->right); } /*非递归的中序遍历*/ void inordertravel(vector<int> & vi, TreeNode * root) { TreeNode *tmp = root; stack<TreeNode *> si; while(!si.empty() || tmp!=NULL) { //找到最底下的左子叶 while(tmp) { si.push(tmp); tmp = tmp->left; } //当tmp沉到底后,出栈(出的是最底下的左子叶) if(!si.empty()) { tmp = si.top(); si.pop(); cout<<root->val; vi.push_back(tmp->val); //进入最底下左子叶的右子叶,开始新的循环 tmp = tmp->right; } } }
二叉树的后序遍历:
(1)基本原理:首先遍历左子树,然后遍历右子树,最后访问当前节点。
(2)代码实现:
void postordertravel(vector<int> & vi, TreeNode *root) { if(root == NULL) return; postordertravel(vi,root->left); postordertravel(vi,root->right); cout<<root->val; vi.push_back(root->val); }
二叉树的层序遍历:
(1)基本原理:从上到下,一层一层地遍历二叉树。主要运用队列的出队和入队来实现。
(2)代码实现:
vector<vector<int>> levelOrder(TreeNode * root) { vector< vector<int> > vvi; if(root == NULL) return vvi; queue<TreeNode *> qt; qt.push(root); int len = 0; while(!qt.empty()) { /*记录该层的元素个数 <---前提是上一层把所有左子树和右子树都压入队列中---> */ len = qt.size(); vector<int> lineval; /*将每层的所有Node都出队,并将所有Node的左右子树都入队*/ while(len--) { cout<<qt.front()->val<<" "; lineval.push_back(qt.front()->val); if(qt.front()->left != NULL) qt.push(qt.front()->left); if(qt.front()->right != NULL) qt.push(qt.front()->right); qt.pop(); } cout<< vvi.push_back(lineval); } return vvi; }