Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
This commit is contained in:
parent
0c04936ccf
commit
ee01a8f5b2
186 changed files with 9605 additions and 4019 deletions
92
hw6/llprograms/sp24_hw3/is_same_tree.ll
Normal file
92
hw6/llprograms/sp24_hw3/is_same_tree.ll
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
; 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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue