중화사전망 - 자전 검색 - 파이썬 프로그래밍이 다이트리 및 7 가지 순회 방법을 구현하는 방법에 대해 자세히 설명합니다.
파이썬 프로그래밍이 다이트리 및 7 가지 순회 방법을 구현하는 방법에 대해 자세히 설명합니다.
이 문서에서는 Python 에서 이진 트리 및 순회 방법의 구현에 대해 설명합니다. 다음과 같이 참고할 수 있도록 공유해 드리겠습니다.
소개:
트리는 주로 검색 효율성을 향상시키고 이진 정렬 트리 및 FP- tree 와 같은 반복 검색에 더 적합한 매우 중요한 데이터 구조입니다. 또한 Haverman 나무와 같은 코딩 효율성을 향상시키는 데도 사용할 수 있습니다.
코드:
파이썬을 사용하여 트리 구성과 여러 순회 알고리즘을 구현하는 것은 어렵지 않지만 코드는 요약됩니다. 구현 기능:
① 나무의 구조
(2) 재귀적으로 1 차 순회, 중급형 순회, 말단 순회를 실현하다.
(3) 스택은 1 차 순회, 중급형 순회 및 후차 순회를 달성한다.
④ 큐는 계층 적 순회를 달성한다.
# 인코딩 =utf-8
클래스 노드 (객체):
""노드 클래스 """
Def init(self, elem=- 1, lchild=None, rchild=None):
Self.elem = elem
Self.lchild = lchild
Self.rchild = rchild
범주 트리 (오브젝트):
""나무 클래스 """
초기화 정의 (자체):
Self.root = Node ()
Self.myQueue = []
정의 추가 (자체, 요소):
""트리에 노드 추가 """
노드 = 노드 (요소)
If self.root.elem ==-1: # 트리가 비어 있으면 루트 노드에 값을 할당합니다.
Self.root = node
Self. my queue. append(self. root)
그렇지 않은 경우:
Treenode = self.myqueue [0] # 이 노드의 하위 트리는 짝수가 아닙니다.
TreeNode.lchild == None 인 경우:
TreeNode.lchild = node
Self.myqueue.append (treenode.l child)
그렇지 않은 경우:
TreeNode.rchild = node
Self.myqueue.append (treenode.rchild)
Self. my queue. pop(0)# 노드에 오른쪽 하위 트리가 있는 경우 해당 노드를 삭제합니다.
Def front _ di GUI(self, 루트):
"""재귀를 이용한 트리 우선 순회" ""
Root == None 인 경우:
돌아오다
Root.elem 을 인쇄합니다.
Self. front _ di GUI(root. l child)
Self.front _ di GUI (루트. rchild)
Def middle _ di GUI(self, 루트):
"""재귀를 이용한 트리의 중간 순서 순회" ""
Root == None 인 경우:
돌아오다
Self.middle _ di GUI (루트 l child)
Root.elem 을 인쇄합니다.
Self.middle _ di GUI (루트. rchild)
Def later _ di GUI(self, 루트):
""""재귀를 사용하여 트리의 후순을 ""을 (를) 반복합니다.
Root == None 인 경우:
돌아오다
Self.later _ di GUI (루트 l child)
Self.later _ di GUI (루트. rchild)
Root.elem 을 인쇄합니다.
Def front_stack (자체, 루트):
""스택을 사용하여 트리 우선 순위 탐색 """
Root == None 인 경우:
돌아오다
MyStack = []
노드 = 루트
While node 또는 myStack:
While node: # 루트 노드부터 왼쪽 하위 트리를 계속 찾습니다.
Node.elem 을 인쇄합니다.
MyStack.append (노드)
Node = node.lchild
Node = my stack. pop()# while 의 끝은 현재 노드가 비어 있음을 나타냅니다. 즉, 이전 노드에 왼쪽 하위 트리가 없습니다.
Node = node.rchild # 오른쪽 하위 트리 보기를 시작합니다.
Def middle_stack (자체, 루트):
""""스택 구현 트리의 중간 순서를 사용하여 ""을 (를) 통과합니다
Root == None 인 경우:
돌아오다
MyStack = []
노드 = 루트
While node 또는 myStack:
While node: # 루트 노드부터 왼쪽 하위 트리를 계속 찾습니다.
MyStack.append (노드)
Node = node.lchild
Node = my stack. pop()# while 의 끝은 현재 노드가 비어 있음을 나타냅니다. 즉, 이전 노드에 왼쪽 하위 트리가 없습니다.
Node.elem 을 인쇄합니다.
Node = node.rchild # 오른쪽 하위 트리 보기를 시작합니다.
Def later _ stack(self, 루트):
\ "\" \ "\" \ "\" \ "\"
Root == None 인 경우:
돌아오다
MyStack 1 = []
MyStack2 = []
노드 = 루트
MyStack 1.append (노드)
While myStack 1: # 이 While 루프는 myStack2 에 저장되는 역순서를 찾는 데 사용됩니다.
Node = myStack 1.pop ()
If node.lchild:
Mystack1.append (노드 l child)
If node.rchild:
Mystack1.append (노드. rchild)
MyStack2.append (노드)
MyStack2: # myStack2 의 요소를 스택 밖으로 밀어냅니다. 이는 postorder 트래버스 순서입니다.
MyStack2.pop () 를 인쇄합니다. 엘엠,
레벨 대기열 정의 (자체, 루트):
"""큐를 사용한 트리 계층 순회" ""
Root == None 인 경우:
돌아오다
내 대기열 = []
노드 = 루트
MyQueue.append (노드)
내 대기열:
Node = my queue. pop(0)
Node.elem 을 인쇄합니다.
If node.lchild! = 없음:
Myqueue.append (노드 l child)
If node.rchild! = 없음:
My queue. append(node. rchild)
If name = =‘main‘':
"주요 기능" ""
Elems = range( 10)# 트리 노드로 10 개의 데이터를 생성합니다.
Tree = Tree()# 새 나무 오브젝트를 만듭니다.
Elem in elems 의 경우:
Tree. Add(elem)# 트리의 노드를 하나씩 추가합니다.
인쇄 대기열은 계층 적 트래버스: "
Tree.level_queue (나무. 루트)
"인쇄"
재귀 구현 우선 순회:'
Tree. front _ di GUI(tree. root)
인쇄
순차 순회의 재귀 적 구현:'
Tree.middle _ di GUI (트리 루트)
인쇄
재귀 적 사후 순회 구현:'
Tree.later _ di GUI (트리 루트)
인쇄
스택 구현 우선 순위 순회:'
Tree. front _ stack(tree. root)
"인쇄"
스택 구현의 순차적 순회:'
Tree. middle _ stack(tree. root)
"인쇄"
스택 구현 후 순차적 순회:'
Tree. later _ stack(tree. root) 요약:
나무의 순회는 주로 두 가지가 있는데, 하나는 깊이가 먼저 순회되는 것 (예: 앞, 중간, 뒤) 이다. 다른 하나는 계층적 순회와 같은 폭 우선 순회입니다. 트리 구조에서는 그 차이가 분명하지 않지만, 나무가 방향 및 방향 다이어그램으로 확장될 때 깊이 우선 검색 및 폭 우선 검색의 효율성과 기능은 여전히 크게 다릅니다.
깊이 우선 순위는 일반적으로 재귀적이며 폭 우선 순위는 일반적으로 대기합니다. 일반적으로 재귀적으로 구현할 수 있는 대부분의 알고리즘도 스택을 통해 구현할 수 있습니다.
나는 나무 한 그루를 만들 수 있는 재귀적인 방법이 있다는 인상을 받았지만, 나는 그것을 어떻게 만들 수 있을지 줄곧 생각해 내지 못했다. 나중에 심사숙고한 결과, 재귀의 사상은 깊이 우선 알고리즘과 약간 유사하며, 나무의 구조는 폭이 우선해야 한다. 재귀를 사용하는 경우 지정된 트리의 깊이와 같은 종료 조건이 있어야 합니다. 그렇지 않으면, 구조된 나무는 왼쪽 단자엽식물이나 오른쪽 단자엽식물에 편향된다. 따라서 일반 트리를 구성할 때 대기열을 사용하는 것이 좋습니다.