首页 > 编程语言 >代码随想训练营的第十五天(Python)| 二叉树的前、中、后续遍历(各种花式遍历哈哈)

代码随想训练营的第十五天(Python)| 二叉树的前、中、后续遍历(各种花式遍历哈哈)

时间:2023-10-25 20:47:17浏览次数:40  
标签:node 遍历 cur res st 二叉树 root 第十五天 append

前序遍历
统一写法用None 来区分遍历查找的节点和处理节点
1、递归法

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        self.preorder(root, res)
        return res

    def preorder(self, root, res):
        if root is None:
            return
        res.append(root.val) # 中
        self.preorder(root.left, res) # 左
        self.preorder(root.right, res)  # 右

2、迭代法

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        stack = [root]
        while stack:
            node = stack.pop()
            if not node:
                return res
            res.append(node.val) # 中
            if node.right:
                stack.append(node.right) # 右
            if node.left:
                stack.append(node.left) # 左
        return res

3、统一写法

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        st = []
        if root:
            st.append(root)
        while st:
            node = st.pop()
            # 查找节点处理
            if node:
                # 右
                if node.right:
                    st.append(node.right)
                # 左
                if node.left:
                    st.append(node.left)
                # 中
                st.append(node)
                st.append(None)
            else:
                node = st.pop()
                res.append(node.val)
        return res

中序遍历
1、递归法

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        self.inorder(root, res)
        return res

    def inorder(self, root, res):
        if root is None:
            return
        self.inorder(root.left, res) # 左
        res.append(root.val)     # 中
        self.inorder(root.right, res) # 右

2、迭代法

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        stack = []
        cur = root # 指针
        while cur or stack:
            # 左
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack.pop() # 中
                res.append(cur.val)
                cur = cur.right   # 右
        return res

3、统一写法

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        st = []
        if root:
            st.append(root)
        while st:
            node = st.pop()
            # 查看节点
            if node:
                # 右
                if node.right:
                    st.append(node.right)
                # 中
                st.append(node)
                st.append(None)
                #左
                if node.left:
                    st.append(node.left)
            # 处理节点
            else:
                node = st.pop()
                res.append(node.val)
        return res

后续遍历
1、递归法

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        self.postorder(root, res)
        return res

    def postorder(self, root, res):
        if root is None:
            return
        self.postorder(root.left, res) # 左
        self.postorder(root.right, res) # 右
        res.append(root.val) # 中

2、迭代法1

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        stack = [root]
        while stack:
            # 中
            node = stack.pop()
            if node is None:
                return res
            res.append(node.val)

            # 左
            if node.left:
                stack.append(node.left)

            # 右
            if node.right:
                stack.append(node.right)

        # 结果为中右左 反转后是 左右中
        return res[::-1]

3、迭代法2

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        stack = []
        pre, cur = None, root # pre 记录已经遍历过的右子节点
        while cur or stack:
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack.pop()
                # 没有右子节点或者右子节点已经遍历过可以将这个节点加入到结果集
                if not cur.right or pre == cur.right:
                    res.append(cur.val)
                    pre = cur
                    cur = None
                else:
                    # 这个节点有节点需要再次入栈
                    stack.append(cur)
                    cur = cur.right
        return res

4、统一写法

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        st = []
        if root:
            st.append(root)
        while st:
            node = st.pop()
            # 查找节点
            if node:
                # 中
                st.append(node)
                st.append(None) # 作标记

                # 右
                if node.right:
                    st.append(node.right)

                # 左
                if node.left:
                    st.append(node.left)
            # 处理节点
            else:
                node = st.pop()
                res.append(node.val)
        return res

标签:node,遍历,cur,res,st,二叉树,root,第十五天,append
From: https://www.cnblogs.com/yixff/p/17788073.html

相关文章

  • 由遍历二维数组的方式引出缓存内存cpu
    对于二维数组,想要遍历的话,一行一行读和一列一列都读可以,但是大多数情况都选择一行一行,为什么呢?涉及到一个缓存的概念,一般都是cpu去计算,它会先去缓存找,如果找不到才去内存,先说缓存,一般缓存就是类似于一行一行,有个临近效应,顺便把旁边的也读了,十分方便,这就是缓存,入股一列一列,读完......
  • [Leetcode] 0101. 对称二叉树
    101.对称二叉树题目描述给你一个二叉树的根节点root,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false 提示:树中节点数目在范围[1,1000]内-100<=Node.val<=100 进阶:你可以运用递......
  • 代码随想训练营第十四天(Python)| 层序遍历 10 、● 226.翻转二叉树 、101.对称二叉树 2
    层序遍历1、迭代法,使用队列classSolution:deflevelOrder(self,root:Optional[TreeNode])->List[List[int]]:res=[]ifrootisNone:returnresqueue=[root]whilequeue:n=len(queue)......
  • 2023-10-24 react+ts 遍历双重对象嵌套数组
    useEffect(()=>{if(value){constarr=value;for(constkinarr){console.log(k,arr[k]);arr[k].key=arr[k].id;arr[k].title=arr[k].name;for(constk2inarr[k].children){arr[k2]......
  • 二叉树遍历(先序、中序、后序)
    学习二叉树遍历(先序、中序、后序)的相关方法二叉树有多种遍历方法,有层次遍历、深度优先遍历、广度优先遍历等。本文只涉及二叉树的先序、中序、后序的递归和非递归遍历。涉及到的代码都用Java编写,可了解其流程。首先给出二叉树节点类:树节点:classTreeNode{intval;......
  • C++算法:二叉树的序列化与反序列化
    #题目序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列/反序列化算法执行逻......
  • ConcurrentModificationException异常,for循环遍历时候, add或者remove减少集合的元素时
    ConcurrentModificationException异常一:ConcurrentModificationException异常:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。二:遍历list集合时删除元素出现的异常publicstaticvoidmain(String[]args){ArrayList<String>list=newArrayList<String>();......
  • C#对没有规律的json字符串转化为对象序列化并遍历读取
    varjsonString={"BillDate":1,"TypeName":0,"StepNum":0,"CollectCode":0,"Uncollected":1,"Tax":0,"AbstractInfo":1}现在我们要对这它进行转化并遍历读取:///<summary>///把json字符串转化为对象//......
  • C++迭代器iterator遍历
    iterator是通用的遍历容器的方式通用模板anySet<a...>as;anySet<a...>::iteratorit=as.begin();for(;it!=as.end();it++){cout<<(*it);//即迭代器it指向的元素}四种迭代器正向迭代器,定义方法如下:容器类名::iterator迭代器名;常量正向迭代器,定义......
  • 已知BST的前序遍历,还原BST
    已知BST的前序遍历,还原BSTpublicstaticTreeNodegetRoot(int[]arr,List<Integer>list){intindex=-1;for(inti=0;i<arr.length;i++){if(list.contains(arr[i])){index=Collections.binarySearch(list,arr[i])......