二叉树遍历的实现

Posted Rgylin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历的实现相关的知识,希望对你有一定的参考价值。


title: 数据结构—二叉树算法(-)
date: 2021-12-07
tags: 数据结构
category: 数据结构


数据结构—二叉树遍历的实现(一)

前言:温习一下数据结构的算法

递归算法

确定递归参数 以及返回值

确定终止条件

前序遍历

逻辑就是:中左右 先访问中间节点然后在访问左边节点虽有就是右边节点

C++实现

struct TreeNode
    int val;
    TreeNode * left;
    TreeNode * right;   
;
int main()

    vector<int> result;
    travel(purpose,result);   

void travel(TreeNode *p,vector<int>&vec)
    if(p==NULL)return ;
    vec.push_back(p->val);
    travel(p->left,vec);
    travel(p->right,vec);


python

def preorderTraversal(self, root: TreeNode) -> List[int]:
        result=[]
        def travel(temp):
            if(temp==None):
                return 
            result.append(temp.val)
            travel(temp.left)
            travel(temp.right)
        
        travel(root)
        return result

中序遍历

改个顺序就ok了,因为这里是前左右 所以要一直递归到左叶子,然后在访问右叶子,(中叶子已经访问完毕

def preorderTraversal(self, root: TreeNode) -> List[int]:
        result=[]
        def travel(temp):
            if(temp==None):
                return 
            travel(temp.left)
            result.append(temp.val)

            travel(temp.right)
        
        travel(root)
        return result

后续遍历

一个样子

def preorderTraversal(self, root: TreeNode) -> List[int]:
        result=[]
        def travel(temp):
            if(temp==None):
                return 
            travel(temp.left)
            travel(temp.right)
            result.append(temp.val)
        
        travel(root)
        return result

非递归算法—前序遍历(用栈实现)

利用栈,因为是中左右 所以我们 首先是将右孩子放入栈中,然后才将左孩子放入,这样如果出栈的时候才是左 然后右 这就起到中左右的顺序 如果遍历节点过程不为空的话 就循环

代码为

def preorderTraversal(self, root: TreeNode) -> List[int]:
        if(root==None):
            return []
        result=[]
        result.append(root)

        while(stack):
            temp= stack.pop()
            result.append(temp.val)
            if(temp.right):
                stack.append(temp.right)
            if(temp.left):
                stack.append(temp.left)

        return result
            
            

非递归算法—中序遍历(用栈实现)

中序遍历是从最左边叶子节点开始的,所以我们先遍历到最左边叶子节点, 遍历完成后, 此时root为NULL 所以弹出父节点,也就是左边叶子节点,访问存储,然后再遍历右节点.

代码为

    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if(not root):
            return []
        
        result=[]
        temp=[]
        while root or temp:
            if(root):
                temp.append(root)
                root= root.left # 遍历左边节点
            else:
                root= temp.pop() #开始访问节点
                result.append(root.val)
                root= root.right#访问右孩子 没有的话将栈中元素弹出 继续访问上一层节点
        return result

非递归算法—后续遍历(用栈实现)

后续遍历是左右中 倒过来就是中右左 将前序遍历中的左和右互换一下就行了

代码为

def preorderTraversal(self, root: TreeNode) -> List[int]:
        if(not root):
            return []
        result=[]
        stack=[root]
        while(stack):
            temp= stack.pop()
            result.append(temp.val)
            if(temp.left):
                stack.append(temp.left)
            if(temp.right):
                stack.append(temp.right)
        return result[::-1]
 

以上是关于二叉树遍历的实现的主要内容,如果未能解决你的问题,请参考以下文章

超强二叉树解析.必收藏!(数组,链表实现,8种遍历方法,前,中,后序线索化二叉树及其遍历)---风之java

二叉树几种遍历算法的非递归实现

Java实现二叉树的创建递归/非递归遍历

Go语言实现二叉树遍历

数据结构之Go实现遍历二叉树

二叉树的遍历:迭代实现