美文网首页
二叉树的遍历

二叉树的遍历

作者: 北国雪WRG | 来源:发表于2019-01-25 20:42 被阅读13次

    前序

    // 递归
    public void preOrderTraverse(TreeNode root) {  
            if (root != null) {  
                System.out.print(root.val+"  ");  
                preOrderTraverse1(root.left);  
                preOrderTraverse1(root.right);  
            }  
        }  
    
    // 非递归
    public void preOrderTraverse(TreeNode root) {  
            LinkedList<TreeNode> stack = new LinkedList<>();  
            TreeNode pNode = root;  
            while (pNode != null || !stack.isEmpty()) {  
                if (pNode != null) {  
                    System.out.print(pNode.val+"  ");  
                    stack.push(pNode);  
                    pNode = pNode.left;  
                } else { 
                    TreeNode node = stack.pop();  
                    pNode = node.right;  
                }  
            }  
        }  
    

    中序

    public void inOrderTraverse(TreeNode root) {  
            LinkedList<TreeNode> stack = new LinkedList<>();  
            TreeNode pNode = root;  
            while (pNode != null || !stack.isEmpty()) {  
                if (pNode != null) {  
                    stack.push(pNode);  
                    pNode = pNode.left;  
                } else { //pNode == null && !stack.isEmpty()  
                    TreeNode node = stack.pop();  
                    System.out.print(node.val+"  ");  
                    pNode = node.right;  
                }  
            }  
        }  
    
    

    后序

    两种策略

    1. 对于任一结点P,将其入栈,然后沿其左子树一直往下搜索。直到搜索到没有左孩子的结点,此时该结点出如今栈顶,可是此时不能将其出栈并訪问,因此其右孩子还为被訪问。
    void postOrder3(BinTree *root)     //非递归后序遍历
    {
        stack<BinTree*> s;
        BinTree *cur;                      //当前结点 
        BinTree *pre=NULL;                 //前一次訪问的结点 
        s.push(root);
        while(!s.empty())
        {
            cur=s.top();
            if((cur->lchild==NULL&&cur->rchild==NULL)||
               (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
            {
                cout<<cur->data<<" ";  //假设当前结点没有孩子结点或者孩子节点都已被訪问过 
                  s.pop();
                pre=cur; 
            }
            else
            {
                if(cur->rchild!=NULL)
                    s.push(cur->rchild);
                if(cur->lchild!=NULL)    
                    s.push(cur->lchild);
            }
        }    
    }
    
    1. 要保证根结点在左孩子和右孩子訪问之后才干訪问,因此对于任一结点P。先将其入栈。假设P不存在左孩子和右孩子。则能够直接訪问它;或者P存在左孩子或者右孩子。可是其左孩子和右孩子都已被訪问过了。则相同能够直接訪问该结点。若非上述两种情况。则将P的右孩子和左孩子依次入栈。这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被訪问。左孩子和右孩子都在根结点前面被訪问。
    void postOrder2(BinTree *root)    //非递归后序遍历
    {
        stack<BTNode*> s;
        BinTree *p=root;
        BTNode *temp;
        while(p!=NULL||!s.empty())
        {
            while(p!=NULL)              //沿左子树一直往下搜索。直至出现没有左子树的结点 
            {
                BTNode *btn=(BTNode *)malloc(sizeof(BTNode));
                btn->btnode=p;
                btn->isFirst=true;
                s.push(btn);
                p=p->lchild;
            }
            if(!s.empty())
            {
                temp=s.top();
                s.pop();
                if(temp->isFirst==true)     //表示是第一次出如今栈顶 
                 {
                    temp->isFirst=false;
                    s.push(temp);
                    p=temp->btnode->rchild;    
                }
                else                        //第二次出如今栈顶 
                 {
                    cout<<temp->btnode->data<<" ";
                    p=NULL;
                }
            }
        }    
    } 
    

    广度

    public void levelTraverse(TreeNode root) {  
            if (root == null) {  
                return;  
            }  
            LinkedList<TreeNode> queue = new LinkedList<>();  
            queue.offer(root);  
            while (!queue.isEmpty()) {  
                TreeNode node = queue.poll();  
                System.out.print(node.val+"  ");  
                if (node.left != null) {  
                    queue.offer(node.left);  
                }  
                if (node.right != null) {  
                    queue.offer(node.right);  
                }  
            }  
        }  
    

    相关文章

      网友评论

          本文标题:二叉树的遍历

          本文链接:https://www.haomeiwen.com/subject/hxivjqtx.html