CS153/hw6/llprograms/sp24_hw3/is_same_tree.ll
jmug ee01a8f5b2 Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 23:10:01 -08:00

92 lines
No EOL
3.1 KiB
LLVM

; is same tree leetcode problem
; sample Java code
; class Solution {
; public boolean isSameTree(TreeNode p, TreeNode q) {
; return dfs(p, q);
; }
; private boolean dfs(TreeNode p, TreeNode q) {
; if (p == null && q == null) {
; return true;
; }
; if (p == null || q == null) {
; return false;
; }
; if (p.val != q.val) return false;
; boolean left = dfs(p.left, q.left);
; boolean right = dfs(p.right, q.right);
; return left && right;
; }
; }
; val, left child, right child
%TreeNode = type { %TreeNode*, %TreeNode*, i64 }
; test with root1 = [1,2,3], root2 = [1,2,3], type
@n2 = global %TreeNode { %TreeNode* null, %TreeNode* null, i64 2 }
@n3 = global %TreeNode { %TreeNode* null, %TreeNode* null, i64 3 }
@root1 = global %TreeNode { %TreeNode* @n2, %TreeNode* @n3, i64 1 }
@n2_2 = global %TreeNode { %TreeNode* null, %TreeNode* null, i64 2 }
@n3_2 = global %TreeNode { %TreeNode* null, %TreeNode* null, i64 3 }
@root2 = global %TreeNode { %TreeNode* @n2_2, %TreeNode* @n3_2, i64 1 }
; root1 = [1,2,3], root3 = [1,null,3] false, modify input & expected to test
@n3_3 = global %TreeNode { %TreeNode* null, %TreeNode* null, i64 3 }
@root3 = global %TreeNode { %TreeNode* null, %TreeNode* @n3_3, i64 1 }
define i1 @is_same_tree(%TreeNode* %r1, %TreeNode* %r2) {
entry:
%r1_check = icmp eq %TreeNode* %r1, null
%r2_check = icmp eq %TreeNode* %r2, null
; check both leaves
%both_true = and i1 %r1_check, %r2_check
%both_cond = icmp eq i1 1, %both_true
br i1 %both_cond, label %ret_true, label %one_null
one_null:
%one_true = or i1 %r1_check, %r2_check
%one_cond = icmp eq i1 1, %one_true
br i1 %one_cond, label %ret_false, label %no_null
no_null:
; compare value
%val1_ptr= getelementptr %TreeNode, %TreeNode* %r1, i64 0, i32 2
%val1 = load i64, i64* %val1_ptr
%val2_ptr = getelementptr %TreeNode, %TreeNode* %r2, i64 0, i32 2
%val2 = load i64, i64* %val2_ptr
%same_val = icmp eq i64 %val1, %val2
br i1 %same_val, label %equal_val, label %ret_false
equal_val:
; get both children from both roots
%left1_p = getelementptr %TreeNode, %TreeNode* %r1, i64 0, i32 0
%left1 = load %TreeNode*, %TreeNode** %left1_p
%right1_p = getelementptr %TreeNode, %TreeNode* %r1, i64 0, i32 1
%right1 = load %TreeNode*, %TreeNode** %right1_p
%left2_p = getelementptr %TreeNode, %TreeNode* %r2, i64 0, i32 0
%left2 = load %TreeNode*, %TreeNode** %left2_p
%right2_p = getelementptr %TreeNode, %TreeNode* %r2, i64 0, i32 1
%right2 = load %TreeNode*, %TreeNode** %right2_p
; left subtree dfs
%left_sub = call i1 @is_same_tree(%TreeNode* %left1, %TreeNode* %left2)
; right subtree dfs
%right_sub = call i1 @is_same_tree(%TreeNode* %right1, %TreeNode* %right2)
; return left && right
%subs_same = and i1 %left_sub, %right_sub
br i1 %subs_same, label %ret_true, label %ret_false
ret_true:
ret i1 1
ret_false:
ret i1 0
}
define i1 @main(i64 %argc, i8** %argv) {
%res = call i1 @is_same_tree(%TreeNode* @root1, %TreeNode* @root2)
ret i1 %res
}