- vừa được xem lúc

Chương 6: TREES - 6.Cây biểu thức(Expression Trees)

0 0 11

Người đăng: Đặng An

Theo Viblo Asia

Nhân ngày mùng một Tết khai bút đầu xuân, mình xin được chúc tất cả mọi người một năm mới thật nhiều sức khỏe, thành công và nhiều may mắn trong cuộc sống. Hi vọng trong năm nay mình sẽ hoàn thành được series này.

6.7 Expression Trees

Cây biểu diễn một biểu thức được gọi là cây biểu thức(Expression Trees). Trong cây biểu thức, các nút lá là toán hạng và các nút không phải lá là toán tử. Điều đó có nghĩa là, một cây biểu thức là một cây nhị phân trong đó các nút bên trong là toán tử và các lá là toán hạng. Một cây biểu thức bao gồm biểu thức nhị phân. Nhưng đối với toán tử một ngôi, một cây con sẽ trống. Hình dưới đây cho thấy một cây biểu thức đơn giản cho (A+BC)/D(A+B*C)/D.

Trong một biểu thức hậu tố(Postfix Expression), một toán tử được viết sau các toán hạng của nó. Mọi người có thể tham khảo thêm định nghĩa và cách chuyển đổi các loại biểu thức này ở đâyở đây

Thuật toán xây dựng Expression Trees từ Postfix Expression

Bây giờ để xây dựng cây biểu thức, chúng ta sử dụng ngăn xếp. Chúng ta lặp qua biểu thức đầu vào và thực hiện các thao tác sau cho mọi ký tự.

  1. Nếu một ký tự là một toán hạng, hãy push ký tự đó vào ngăn xếp
  2. Nếu một ký tự là toán tử, hãy pop hai giá trị từ ngăn xếp, biến chúng thành con của nó và đẩy lại nút hiện tại. Cuối cùng, phần tử duy nhất của ngăn xếp sẽ là gốc của cây biểu thức.

Code của thuật toán này mình có tham khảo ở đây

import java.util.Stack; class Node{ char data; Node left,right; public Node(char data){ this.data = data; left = right = null; }
} public class Main { public static boolean isOperator(char ch){ if(ch=='+' || ch=='-'|| ch=='*' || ch=='/' || ch=='^'){ return true; } return false; } public static Node expressionTree(String postfix){ Stack<Node> st = new Stack<Node>(); Node t1,t2,temp; for(int i=0;i<postfix.length();i++){ if(!isOperator(postfix.charAt(i))){ temp = new Node(postfix.charAt(i)); st.push(temp); } else{ temp = new Node(postfix.charAt(i)); t1 = st.pop(); t2 = st.pop(); temp.left = t2; temp.right = t1; st.push(temp); } } temp = st.pop(); return temp; } public static void inorder(Node root){ if(root==null) return; inorder(root.left); System.out.print(root.data); inorder(root.right); } public static void main(String[] args) { String postfix = "ABC*+D/"; Node r = expressionTree(postfix); inorder(r); }
}

Mô tả cụ thể cách thuật toán hoạt động

Giả sử rằng một phần tử được đọc tại một thời điểm. Nếu phần tử là một toán hạng, chúng ta tạo một node và push nó vào một ngăn xếp. Nếu phần tử là một toán tử, pop hai cây T1 và T2 từ ngăn xếp (T1 được pop lên trước) và tạo thành một cây mới có gốc là toán tử và các con bên trái và bên phải của nó lần lượt trỏ tới T2 và T1. Node mới này sau đó được đẩy vào ngăn xếp. Ví dụ: giả sử đầu vào là ABC*+D/. Ba biểu tượng đầu tiên là toán hạng, vì vậy hãy tạo các nút cây và đẩy các con trỏ tới chúng vào một ngăn xếp như hình bên dưới.

Tiếp theo, một toán tử '*' được đọc, do đó, hai node được bật ra, một cây mới được hình thành và một node mới được đẩy vào ngăn xếp.

Tiếp theo, toán tử '+' được đọc, do đó, hai node được bật ra, một cây mới được hình thành và một node mới được đẩy vào ngăn xếp.

Tiếp theo, toán hạng 'D' được đọc, cây một nút được tạo và con trỏ tới cây tương ứng được đẩy vào ngăn xếp.

Cuối cùng, ký hiệu cuối cùng (‘/’) được đọc, hai cây được hợp nhất và một con trỏ tới cây cuối cùng được để lại trên ngăn xếp.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đôi chút về cấu trúc dữ liệu và thuật toán

Theo anh Phạm Huy Hoàng (toidicodedao) đã viết trong blog của mình là kiến thức trong ngành IT có 2 loại, một là càng để lâu thì càng cũ, lạc hậu và trở lên vô dụng. Hai là càng để lâu thì càng có giá trị thậm chí ngày càng có giá.

0 0 32

- vừa được xem lúc

Cấu trúc dữ liệu Merkle Tree

Cây Merkle là một cây nhị phân có thứ tự được xây dựng từ một dãy các đối tượng dữ liệu (d1, d2,...,dn) sử dụng hàm băm h. Các “lá” của cây là các giá trị băm h(di) đối với 1 ≤ i ≤ n.

0 0 46

- vừa được xem lúc

Cách xây dựng cấu trúc dữ liệu Stack và Queue.

Mở đầu. Hello các bạn, hôm nay mình sẽ chia sẻ với các bạn cách để có thể tự xây dựng 2 loại cấu trúc dữ liệu stack(ngăn xếp) và queue(hàng đợi) sử dụng mảng trong C++;.

0 0 31

- vừa được xem lúc

Tối ưu ứng dụng với cấu trúc dữ liệu cơ bản

Ở Việt Nam có một nghịch lý ai cũng biết: hầu hết sinh viên ngành CNTT đều đã học cấu trúc dữ liệu và giải thuật, thuộc các môn bắt buộc. Thế nhưng lại rất hiếm khi ứng dụng vào công việc hoặc bị loại

0 0 36

- vừa được xem lúc

Chương 1: Introduction - Analysis of Algorithrms

Trong bài viết này mình sẽ nói về cách chúng ta sẽ sử dụng để phân tích và so sánh các loại thuật toán khác nhau. 1.

0 0 15

- vừa được xem lúc

Chương 1: Introduction - Các khái niệm cơ bản

Lời nói đầu. Trước khi có máy tính, đã có các thuật toán.

0 0 16