BST级别顺序遍历

时间:2019-07-12 03:52:17

标签: python python-3.x algorithm

我有一些有关BST的代码,并且我想使用BST级别顺序遍历(节点左右-左右)打印输出。这是代码:

import sys

class Node:
    def __init__(self,data):
        self.right=self.left=None
        self.data = data
class Solution:
    def insert(self,root,data):
        if root==None:
            return Node(data)
        else:
            if data<=root.data:
                cur=self.insert(root.left,data)
                root.left=cur
            else:
                cur=self.insert(root.right,data)
                root.right=cur
        return root


    def levelOrder(self,root):
        #Write your code here
        nodes_to_search = list()
        nodes_traversed = ''
        nodes_to_search.append(root)
        while len(nodes_to_search) > 0:
            nodes = nodes_to_search.pop(0)
            if nodes.left:
                nodes_to_search.append(nodes.left)
            if nodes.right:
                nodes_to_search.append(nodes.right)
            nodes_traversed += str(nodes.data) + ' '
        print(nodes_traversed)


T=int(input())
myTree=Solution()
root=None
for i in range(T):
    data=int(input())
    root=myTree.insert(root,data)
myTree.levelOrder(root)


6
3
5
4
7
2
1 # it prints out 3 5 2 1 4 7

输出就像我预期的那样,node-left-right。但是我不明白levelOrder()函数如何像这样打印?

2 个答案:

答案 0 :(得分:0)

简单的列表操作,以保持顺序

  1. 每次,我们从nodes_search_list中获取第一个元素
await
  1. 将左子项推到右子项之前(因此,我们总是先左后右)
nodes = nodes_to_search.pop(0)

答案 1 :(得分:0)

您得到的输出不正确。如果您使用输入(3、5、4、7、2、1)进行BST,则将获得此输出-水平顺序遍历中的3 2 5 1 4 7 [因为所有较低的值都会在根元素,所有较高的值将在根节点的右侧]。该方案是首先打印根元素,然后转到每个级别并打印该级别中的所有元素。

我将建议您按照任何程序进行操作,

  1. BFS过程:

     function BFSearch(Tree root){
      Queue queue.enqueue(root);
      while(queue isnot Empty){
          Root tempRoot = queue.dequeue();
          print -> tempRoot.element; // visting node
    
          /*break-down each level left to right*/
          if(tempRoot.left isnot Empty){
                queue.enqueue(tempRoot.left);
          }
          if(tempRoot.right isnot Empty){
               queue.enqueue(tempRoot.right);
          }
      }  
    }
    
  2. 您也可以使用以下递归方法-

     function driver(){
    // visiting the root first;
      print -> root.node;
    
      levelOrderPrinting(root);
     } 
     function levelOrderPrinting(Tree root){
      if(root is null) 
       return;
    
      if(root.left isnot Empty)
       print -> root.left.node;
    
      if(root.right isnot Empty)
       print -> root.right.node;
    
      // break down each level left to right
    
       levelOrderPrinting(root.left);
       levelOrderPrinting(root.right);
    }