中序遍历的遍历方法是:对于当前节点,先遍历左子树,然后访问当前节点,最后遍历右子树。中序遍历是二叉树遍历的一种,也称为中根遍历、中序遍历。
//递归
类解决方案1 {
民众:
矢量
2.迭代法
迭代法中,从根节点开始寻找二叉树最左边的节点,将传递过来的节点保存在一个栈中,找到后访问最左边的节点。对于每个节点来说,它都是基于它自己的。访问完根子树的根节点后,就可以去找右孩子了。代码如下:
//迭代,使用堆栈 类解决方案2 { 民众: 矢量inorderTraversal(TreeNode* root) { 矢量 ret; if(root==NULL)返回ret; 树节点 *curr=root; 堆叠 st;while(!st.empty()||curr!=NULL) { while(curr!=NULL) { st.push(curr); curr=curr->左; } curr=www.sychzs.cn(); st.pop(); ret.push_back(curr->val); curr=curr->右; } 返回ret; } };
这种方法的时间复杂度是O(n),空间复杂度也是O(n)。
3。莫里斯法
这个方法是莫里斯发明的。读完之后,感觉非常精妙。该方法不使用递归,不使用栈,以O(1)空间复杂度完成二叉树遍历。该方法的基本思想是将所有右子为NULL的节点的右子指向后继节点(对于右子不为null的节点,右子为下一个要访问的节点)。这样,对于任意一个节点,访问它后,它的右子已经指向下一个要访问的节点。对于最右边的节点,不需要这样的操作。注意,这个操作是在遍历过程中完成的,完成节点访问后,树会被恢复。整个循环的判断条件是当前节点是否为空。比如上面的二叉树,遍历过程如下(根据当前节点c的位置):
(1) 当前节点为10,因为左儿子不为空,无法访问。找到c的左子树的最右边的节点p:
//莫里斯遍历,没有堆栈
类解决方案3 {
民众:
矢量
推荐教程:《C#》