河北商城网站建设价格,做一个网站后期维护需要多少钱,深圳品牌网站设计公司,邯郸网站建设效果好迭代实现二叉树的遍历
迭代法实现前序遍历 前序遍历是中左右#xff0c;如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码#xff1a;#xff08;注意代码中#xff0c;空节点不入栈#xff09;
public ListIntegerpreorde… 迭代实现二叉树的遍历
迭代法实现前序遍历 前序遍历是中左右如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码注意代码中空节点不入栈
public ListIntegerpreorderTraversal(TreeNode root){
ListIntegerres new ArrayListInteger();
if(root null){return res;
}
DequeTreeNode stack new LinkedListTreeNode();
TreeNode node root;
while(!stack.isEmpty() || node ! null){while(node ! null){res.add(node.val);stack.push(node);node node.left;}node stack.pop();node node.right;
}
return res;
}迭代法实现中序遍历 再看中序遍历中序遍历是左中右先访问的是二叉树左子树的节点然后一层一层向下访问直到到达树左面的最底部再开始处理节点也就是在把节点的数值放进s列表中。在使用迭代法写中序遍历就需要借用指针的遍历来帮助访问节点栈则用来处理节点上的元素。看代码
public ListIntegerinorderTraversal(TreeNode root){
ListInteger res new ArrayListInteger();
DequeTreeNode stack new LinkedListTreeNode();
while (root ! null || !stack.isEmpty()){while (root ! null){stack.push(root);root root.left;}root stack.pop();res.add(root.val);root root.right;
}
return res;
}迭代法实现后序遍历 后序遍历的非递归实现有三种基本的思路反转法、访问标记法、和Mos法可惜三种理解起来都有些难度。 访问标记法是最难理解的方法而Mos法是一个老外发明的巧妙思想不使用栈而是用好树中的null指针但是实现后序仍然非常麻烦我们这里不再展开感兴趣的同学可以查一下 这里分享一种好理解又好实现的方法反转法。如下图我们先观察后序遍历的结果是seq{95743},如果我们将其整体反转的话就是new_seq{34759}。 得到new_seql的方法和前序遍历思路几乎一致只不过是左右反了。前序是先中间再左边然后右边而这里是先中间再后边然后左边。那我们完全可以改造一下前序遍历得到序列new_seq之后再reverse一下就是想要的结果了代码如下
public ListIntegerpostorderTraversal(TreeNode root){
ListIntegerres new ArrayList();
if (root null)return res;
StackTreeNodestack new stack();
TreeNode node root;
while(!stack.isEmpty() || node ! null){while(node ! null){res.add(node.val);stack.push(node);node node.right; //是right不是left}node stack.pop();node node.left;
}
//注意反转要用Collections
Collections.reverse(res);
return res;
}