2012-02-03 8 views
6

누군가 이진 표현 트리를 작성하는 방법을 설명 할 수 있습니까?이진 표현 트리 만들기

예를 들어, 문자열이 2*(1+(2*1)); 이진 표현 트리로 변환하는 방법이 있습니다.

* 
| \ 
| \ 
2 + 
    |\ 
    1 * 
     |\ 
     2 1 
+0

shunting-yard 알고리즘을 사용하여 솔루션을 구현할 수 있습니다. 다음은 위키피디아에 대한 세부 정보입니다 : . 이 골목은 Edsger Dijkstra에 의해 발명되었습니다. 아주 좋은 대안입니다.몇 가지 세부 사항이 필요하다면 C#에서 작성한 코드 예제를 게시 할 수 있지만 위키피디아 링크가 충분하다고 가정합니다. –

답변

2

에 당신이 필요합니다 :

  1. 이 문자열
  2. 쓰기에서 토큰을 읽는 어휘 분석기 쓰기 언어를 설명하는 문법을 정의 토큰에서 나무를 만드는 파서

예를 들어,이 방법에 대해 살펴 : http://en.wikipedia.org/wiki/Recursive_descent_parser

다른 접미사 나 접두사

+2

표현식이 구문 분석되는 방식을 시각적으로 보여주는 다소 단순한 과제는 과장 될 수 있습니다. –

9

변환 중위가

후위 입력은 다음과 같습니다 AB +의 CDE + **

  1. 심볼이 아닌 경우 첫 번째 문자를 고려한 다음 노드를 만듭니다. 스택에 추가합니다.
  2. chara cter는 심볼이며 심볼 pop 요소가있는 노드를 만들고 심볼의 왼쪽과 오른쪽에 추가합니다.
  3. 심볼 노드를 스택에 푸시합니다. 반복자까지
  4. 반복 1, 2, 3은 더 이상 요소를

자바 구현이 없습니다

public Tree.TreeNode createExpressionTree(){ 
    Iterator<Character>itr = postOrder.iterator(); 
    Tree tree = new Tree(); 
    NodeStack nodeStack = new NodeStack(); 
    Tree.TreeNode node; 
    while (itr.hasNext()) { 
     Character c = itr.next(); 
     if(!isDigit(c)){ 
      node = tree.createNode(c); 
      node.right = nodeStack.pop(); 
      node.left = nodeStack.pop(); 
      nodeStack.push(node); 
     }else{ 
      node = tree.creteNode(c); 
      nodeStack.push(node); 
     } 
    } 
    node = nodeStack.pop(); 
    return node; 
} 

상세 정보 : http://en.wikipedia.org/wiki/Binary_expression_tree

그것은 두 단계로 나눌 수 있습니다
+1

여기 기호 = 연산자 –

0

:

  1. 각 토큰의 우선 순위 값을 계산하십시오. 예를 들어

    '+'1 'X'2 번호 : INF, '(',베이스 (10)를 추가 ')')베이스 10 빼기

  2. 빌드 Cartesian tree에 기초 스택을 사용하여 우선 순위 (약 5 줄의 코드)

한 번의 스캔으로 처리 할 수 ​​있습니다.