// File: ambersun1234[P]AVL_Tree/src/avl_tree.cpp
// Function: main
int main( int argc , const char *argv[] ) {
	AVLTree< int > myAVLTree;
	string command;
	int input;

	while ( true ) {
		menu();
		cout << "> ";
		cin >> command;

		if ( command == "a" || command == "A" ) { // done
			cout << "please enter the number for add: ";
			cin >> input;
			if ( myAVLTree.insertHelper( input ) ) cout << "add successfully" << endl;
			else cout << "add failed" << endl;
		}
		else if ( command == "c" || command == "C" ) {
			myAVLTree.clearTreeHelper();
			cout << "clear tree done" << endl;
		}
		else if ( command == "r" || command == "R" ) {
			cout << "please enter the number to remove: ";
			cin >> input;
			if ( myAVLTree.removeHelper( input ) ) cout << "removed successfully" << endl;
			else cout << "removed failed" << endl;
		}
		else if ( command == "f" || command == "F" ) {
			cout << "please enter the number to find: ";
			cin >> input;
			cout << "the predecessor is " << myAVLTree.findPredecessorHelper( input ) << endl;
		}
		else if ( command == "t" || command == "T" ) { // done
			cout << "inorder traversal:";
			myAVLTree.inorderTraversalHelper( display );
			cout << endl;
			cout << "preorder traversal:";
			myAVLTree.preorderTraversalHelper( display );
			cout << endl;
			cout << "postorder traversal:";
			myAVLTree.postorderTraversalHelper( display );
			cout << endl;
			cout << "levelorder traversal:";
			myAVLTree.levelorderTraversalHelper( display );
			cout << endl;
		}
		else if ( command == "n" || command == "N" ) { // done
			cout << "the AVL Tree contain " << myAVLTree.getNumberOfNodesHelper() << " nodes" << endl;
		}
		else if ( command == "s" || command == "S" ) { // done
			cout << "please enter the number to search: ";
			cin >> input;
			if ( myAVLTree.searchHelper( input ) ) cout << "target found" << endl;
			else cout << "failed to find target in the AVL Tree" << endl;
		}
		else if ( command == "x" || command == "X" ) {
			cout << "see you~~ bye~~" << endl;
			break;
		}
		else {
			cout << "input error , please enter the command again." << endl;
		}
		cout << endl;
	}
	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x18(%rbp), %rdi
callq 0x2bd0
leaq -0x38(%rbp), %rdi
callq 0x2140
jmp 0x242d
callq 0x2390
jmp 0x2434
movq 0x6b95(%rip), %rdi      # 0x8fd0
leaq 0x3c4a(%rip), %rsi      # 0x608c
callq 0x20d0
jmp 0x2449
movq 0x6b90(%rip), %rdi      # 0x8fe0
leaq -0x38(%rbp), %rsi
callq 0x2120
jmp 0x245b
leaq 0x3c2d(%rip), %rsi      # 0x608f
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0x4d(%rbp)
jmp 0x2470
movb -0x4d(%rbp), %al
testb $0x1, %al
jne 0x249a
jmp 0x2479
leaq 0x3c11(%rip), %rsi      # 0x6091
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0x4e(%rbp)
jmp 0x248e
movb -0x4e(%rbp), %al
testb $0x1, %al
jne 0x249a
jmp 0x255d
movq 0x6b2f(%rip), %rdi      # 0x8fd0
leaq 0x3beb(%rip), %rsi      # 0x6093
callq 0x20d0
jmp 0x24af
movq 0x6b2a(%rip), %rdi      # 0x8fe0
leaq -0x3c(%rbp), %rsi
callq 0x2090
jmp 0x24c1
movl -0x3c(%rbp), %esi
leaq -0x18(%rbp), %rdi
callq 0x2c20
movb %al, -0x4f(%rbp)
jmp 0x24d2
movb -0x4f(%rbp), %al
testb $0x1, %al
jne 0x24db
jmp 0x252b
movq 0x6aee(%rip), %rdi      # 0x8fd0
leaq 0x3bcc(%rip), %rsi      # 0x60b5
callq 0x20d0
movq %rax, -0x58(%rbp)
jmp 0x24f4
movq -0x58(%rbp), %rdi
movq 0x6ac1(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2506
jmp 0x2558
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x20a0
leaq -0x18(%rbp), %rdi
callq 0x2e80
jmp 0x2b8e
movq 0x6a9e(%rip), %rdi      # 0x8fd0
leaq 0x3b8d(%rip), %rsi      # 0x60c6
callq 0x20d0
movq %rax, -0x60(%rbp)
jmp 0x2544
movq -0x60(%rbp), %rdi
movq 0x6a71(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2556
jmp 0x2558
jmp 0x2b4f
leaq 0x3b6d(%rip), %rsi      # 0x60d1
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0x61(%rbp)
jmp 0x2572
movb -0x61(%rbp), %al
testb $0x1, %al
jne 0x2599
jmp 0x257b
leaq 0x3b51(%rip), %rsi      # 0x60d3
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0x62(%rbp)
jmp 0x2590
movb -0x62(%rbp), %al
testb $0x1, %al
jne 0x2599
jmp 0x25d4
leaq -0x18(%rbp), %rdi
callq 0x2cb0
jmp 0x25a4
movq 0x6a25(%rip), %rdi      # 0x8fd0
leaq 0x3b23(%rip), %rsi      # 0x60d5
callq 0x20d0
movq %rax, -0x70(%rbp)
jmp 0x25bd
movq -0x70(%rbp), %rdi
movq 0x69f8(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x25cf
jmp 0x2b4d
leaq 0x3aa4(%rip), %rsi      # 0x607f
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0x71(%rbp)
jmp 0x25e9
movb -0x71(%rbp), %al
testb $0x1, %al
jne 0x2613
jmp 0x25f2
leaq 0x3aec(%rip), %rsi      # 0x60e5
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0x72(%rbp)
jmp 0x2607
movb -0x72(%rbp), %al
testb $0x1, %al
jne 0x2613
jmp 0x26b9
movq 0x69b6(%rip), %rdi      # 0x8fd0
leaq 0x3ac6(%rip), %rsi      # 0x60e7
callq 0x20d0
jmp 0x2628
movq 0x69b1(%rip), %rdi      # 0x8fe0
leaq -0x3c(%rbp), %rsi
callq 0x2090
jmp 0x263a
movl -0x3c(%rbp), %esi
leaq -0x18(%rbp), %rdi
callq 0x2ce0
movb %al, -0x73(%rbp)
jmp 0x264b
movb -0x73(%rbp), %al
testb $0x1, %al
jne 0x2654
jmp 0x2681
movq 0x6975(%rip), %rdi      # 0x8fd0
leaq 0x3aa9(%rip), %rsi      # 0x610b
callq 0x20d0
movq %rax, -0x80(%rbp)
jmp 0x266d
movq -0x80(%rbp), %rdi
movq 0x6948(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x267f
jmp 0x26b4
movq 0x6948(%rip), %rdi      # 0x8fd0
leaq 0x3a91(%rip), %rsi      # 0x6120
callq 0x20d0
movq %rax, -0x88(%rbp)
jmp 0x269d
movq -0x88(%rbp), %rdi
movq 0x6915(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x26b2
jmp 0x26b4
jmp 0x2b4b
leaq 0x3a6f(%rip), %rsi      # 0x612f
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0x89(%rbp)
jmp 0x26d1
movb -0x89(%rbp), %al
testb $0x1, %al
jne 0x2704
jmp 0x26dd
leaq 0x3a4d(%rip), %rsi      # 0x6131
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0x8a(%rbp)
jmp 0x26f5
movb -0x8a(%rbp), %al
testb $0x1, %al
jne 0x2704
jmp 0x2790
movq 0x68c5(%rip), %rdi      # 0x8fd0
leaq 0x3a21(%rip), %rsi      # 0x6133
callq 0x20d0
jmp 0x2719
movq 0x68c0(%rip), %rdi      # 0x8fe0
leaq -0x3c(%rbp), %rsi
callq 0x2090
jmp 0x272b
movq 0x689e(%rip), %rdi      # 0x8fd0
leaq 0x3a1c(%rip), %rsi      # 0x6155
callq 0x20d0
movq %rax, -0x98(%rbp)
jmp 0x2747
movl -0x3c(%rbp), %esi
leaq -0x18(%rbp), %rdi
callq 0x2d20
movl %eax, -0x9c(%rbp)
jmp 0x275b
movl -0x9c(%rbp), %esi
movq -0x98(%rbp), %rdi
callq 0x2190
movq %rax, -0xa8(%rbp)
jmp 0x2776
movq -0xa8(%rbp), %rdi
movq 0x683c(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x278b
jmp 0x2b49
leaq 0x38f3(%rip), %rsi      # 0x608a
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0xa9(%rbp)
jmp 0x27a8
movb -0xa9(%rbp), %al
testb $0x1, %al
jne 0x27db
jmp 0x27b4
leaq 0x39ae(%rip), %rsi      # 0x6169
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0xaa(%rbp)
jmp 0x27cc
movb -0xaa(%rbp), %al
testb $0x1, %al
jne 0x27db
jmp 0x28d0
movq 0x67ee(%rip), %rdi      # 0x8fd0
leaq 0x3982(%rip), %rsi      # 0x616b
callq 0x20d0
jmp 0x27f0
leaq -0x4d7(%rip), %rsi      # 0x2320
leaq -0x18(%rbp), %rdi
callq 0x2d70
jmp 0x2802
movq 0x67c7(%rip), %rdi      # 0x8fd0
movq 0x67b0(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2817
movq 0x67b2(%rip), %rdi      # 0x8fd0
leaq 0x3959(%rip), %rsi      # 0x617e
callq 0x20d0
jmp 0x282c
leaq -0x513(%rip), %rsi      # 0x2320
leaq -0x18(%rbp), %rdi
callq 0x2da0
jmp 0x283e
movq 0x678b(%rip), %rdi      # 0x8fd0
movq 0x6774(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2853
movq 0x6776(%rip), %rdi      # 0x8fd0
leaq 0x3931(%rip), %rsi      # 0x6192
callq 0x20d0
jmp 0x2868
leaq -0x54f(%rip), %rsi      # 0x2320
leaq -0x18(%rbp), %rdi
callq 0x2dd0
jmp 0x287a
movq 0x674f(%rip), %rdi      # 0x8fd0
movq 0x6738(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x288f
movq 0x673a(%rip), %rdi      # 0x8fd0
leaq 0x390a(%rip), %rsi      # 0x61a7
callq 0x20d0
jmp 0x28a4
leaq -0x58b(%rip), %rsi      # 0x2320
leaq -0x18(%rbp), %rdi
callq 0x2e00
jmp 0x28b6
movq 0x6713(%rip), %rdi      # 0x8fd0
movq 0x66fc(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x28cb
jmp 0x2b47
leaq 0x38e6(%rip), %rsi      # 0x61bd
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0xab(%rbp)
jmp 0x28e8
movb -0xab(%rbp), %al
testb $0x1, %al
jne 0x2918
jmp 0x28f4
leaq 0x38c4(%rip), %rsi      # 0x61bf
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0xac(%rbp)
jmp 0x290c
movb -0xac(%rbp), %al
testb $0x1, %al
jne 0x2918
jmp 0x2996
movq 0x66b1(%rip), %rdi      # 0x8fd0
leaq 0x389b(%rip), %rsi      # 0x61c1
callq 0x20d0
movq %rax, -0xb8(%rbp)
jmp 0x2934
leaq -0x18(%rbp), %rdi
callq 0x2e30
movl %eax, -0xbc(%rbp)
jmp 0x2945
movl -0xbc(%rbp), %esi
movq -0xb8(%rbp), %rdi
callq 0x2190
movq %rax, -0xc8(%rbp)
jmp 0x2960
movq -0xc8(%rbp), %rdi
leaq 0x3869(%rip), %rsi      # 0x61d7
callq 0x20d0
movq %rax, -0xd0(%rbp)
jmp 0x297c
movq -0xd0(%rbp), %rdi
movq 0x6636(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2991
jmp 0x2b45
leaq 0x383f(%rip), %rsi      # 0x61dc
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0xd1(%rbp)
jmp 0x29ae
movb -0xd1(%rbp), %al
testb $0x1, %al
jne 0x29e1
jmp 0x29ba
leaq 0x381d(%rip), %rsi      # 0x61de
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0xd2(%rbp)
jmp 0x29d2
movb -0xd2(%rbp), %al
testb $0x1, %al
jne 0x29e1
jmp 0x2a93
movq 0x65e8(%rip), %rdi      # 0x8fd0
leaq 0x37f1(%rip), %rsi      # 0x61e0
callq 0x20d0
jmp 0x29f6
movq 0x65e3(%rip), %rdi      # 0x8fe0
leaq -0x3c(%rbp), %rsi
callq 0x2090
jmp 0x2a08
movl -0x3c(%rbp), %esi
leaq -0x18(%rbp), %rdi
callq 0x2e50
movb %al, -0xd3(%rbp)
jmp 0x2a1c
movb -0xd3(%rbp), %al
testb $0x1, %al
jne 0x2a28
jmp 0x2a5b
movq 0x65a1(%rip), %rdi      # 0x8fd0
leaq 0x37ce(%rip), %rsi      # 0x6204
callq 0x20d0
movq %rax, -0xe0(%rbp)
jmp 0x2a44
movq -0xe0(%rbp), %rdi
movq 0x656e(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2a59
jmp 0x2a8e
movq 0x656e(%rip), %rdi      # 0x8fd0
leaq 0x37a8(%rip), %rsi      # 0x6211
callq 0x20d0
movq %rax, -0xe8(%rbp)
jmp 0x2a77
movq -0xe8(%rbp), %rdi
movq 0x653b(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2a8c
jmp 0x2a8e
jmp 0x2b43
leaq 0x379d(%rip), %rsi      # 0x6237
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0xe9(%rbp)
jmp 0x2aab
movb -0xe9(%rbp), %al
testb $0x1, %al
jne 0x2adb
jmp 0x2ab7
leaq 0x377b(%rip), %rsi      # 0x6239
leaq -0x38(%rbp), %rdi
callq 0x2bf0
movb %al, -0xea(%rbp)
jmp 0x2acf
movb -0xea(%rbp), %al
testb $0x1, %al
jne 0x2adb
jmp 0x2b0e
movq 0x64ee(%rip), %rdi      # 0x8fd0
leaq 0x3752(%rip), %rsi      # 0x623b
callq 0x20d0
movq %rax, -0xf8(%rbp)
jmp 0x2af7
movq -0xf8(%rbp), %rdi
movq 0x64bb(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2b0c
jmp 0x2b69
movq 0x64bb(%rip), %rdi      # 0x8fd0
leaq 0x372f(%rip), %rsi      # 0x624b
callq 0x20d0
movq %rax, -0x100(%rbp)
jmp 0x2b2a
movq -0x100(%rbp), %rdi
movq 0x6488(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2b3f
jmp 0x2b41
jmp 0x2b43
jmp 0x2b45
jmp 0x2b47
jmp 0x2b49
jmp 0x2b4b
jmp 0x2b4d
jmp 0x2b4f
movq 0x647a(%rip), %rdi      # 0x8fd0
movq 0x6463(%rip), %rsi      # 0x8fc0
callq 0x2100
jmp 0x2b64
jmp 0x242b
movl $0x0, -0x4(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x20a0
leaq -0x18(%rbp), %rdi
callq 0x2e80
movl -0x4(%rbp), %eax
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
movq -0x48(%rbp), %rdi
callq 0x21a0
nopw (%rax,%rax)