View Code
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <stack> 5 using namespace std; 6 7 typedef struct TreeNode 8 { 9 int data; 10 struct TreeNode * left; 11 struct TreeNode * right; 12 }TreeNode; 13 14 TreeNode node[11],node1[3]; 15 TreeNode *root1=&node[0],*root2=&node1[0]; 16 17 int compare(TreeNode *p1,TreeNode *p2) 18 { 19 if(p2==NULL)return 1; 20 else if(p1==NULL)return 0; 21 if(p1->data!=p2->data) 22 { 23 return compare(p1->left,root2)||compare(p1->right,root2); 24 } 25 else 26 { 27 return compare(p1->left,p2->left)&&compare(p1->right,p2->right); 28 } 29 } 30 31 void preorder(TreeNode *p) 32 { 33 if(p!=NULL) 34 { 35 printf("%d ",p->data); 36 preorder(p->left); 37 preorder(p->right); 38 } 39 } 40 41 void inorder(TreeNode *p) 42 { 43 if(p!=NULL) 44 { 45 inorder(p->left); 46 printf("%d ",p->data); 47 inorder(p->right); 48 } 49 } 50 51 void postorder(TreeNode *p) 52 { 53 if(p!=NULL) 54 { 55 postorder(p->left); 56 postorder(p->right); 57 printf("%d ",p->data); 58 } 59 } 60 61 void print_data(TreeNode *p) 62 { 63 printf("%d ",p->data); 64 } 65 66 void println() 67 { 68 printf("\n"); 69 } 70 71 void preorder_loop(TreeNode *p) 72 { 73 stack<TreeNode*> s; 74 while(p!=NULL) 75 { 76 print_data(p); 77 s.push(p); 78 p = p->left; 79 } 80 while(!s.empty()) 81 { 82 TreeNode * temp = s.top(); 83 s.pop(); 84 temp = temp->right; 85 while(temp!=NULL) 86 { 87 print_data(temp); 88 s.push(temp); 89 temp = temp->left; 90 } 91 } 92 } 93 94 void inorder_loop(TreeNode *p) 95 { 96 stack<TreeNode*> s; 97 while(p!=NULL) 98 { 99 s.push(p); 100 p = p->left; 101 } 102 while(!s.empty()) 103 { 104 TreeNode * temp = s.top(); 105 s.pop(); 106 print_data(temp); 107 temp = temp->right; 108 while(temp!=NULL) 109 { 110 s.push(temp); 111 temp = temp->left; 112 } 113 } 114 } 115 116 TreeNode* visited[100]; 117 int vnum=0; 118 119 int find(TreeNode *temp) 120 { 121 int i; 122 for(i=0;i<vnum;i++) 123 { 124 if(visited[i]==temp)return 1; 125 } 126 visited[vnum++] = temp; 127 return 0; 128 } 129 130 void postorder_loop(TreeNode *p) 131 { 132 stack<TreeNode*> s; 133 while(p!=NULL) 134 { 135 s.push(p); 136 p = p->left; 137 } 138 while(!s.empty()) 139 { 140 TreeNode * temp = s.top(); 141 if(temp->right==NULL||find(temp)) 142 { 143 print_data(temp); 144 s.pop(); 145 } 146 else 147 { 148 temp = temp->right; 149 while(temp!=NULL) 150 { 151 s.push(temp); 152 temp = temp->left; 153 } 154 } 155 } 156 } 157 158 TreeNode *pathp[100],*pathq[100]; 159 int pnum=0,qnum=0; 160 int f=0; 161 void dfs(TreeNode *root,TreeNode *p,TreeNode**path,int *num) 162 { 163 if(f)return; 164 if(root==p) 165 { 166 f = 1; 167 return; 168 } 169 if(root->left!=NULL&&!f) 170 { 171 path[(*num)++] = root->left; 172 dfs(root->left,p,path,num); 173 if(!f)(*num)--; 174 } 175 if(root->right!=NULL&&!f) 176 { 177 path[(*num)++] = root->right; 178 dfs(root->right,p,path,num); 179 if(!f)(*num)--; 180 } 181 } 182 183 TreeNode * find_last_same_node() 184 { 185 int i=0; 186 while(pathp[i]==pathq[i])i++; 187 return pathp[i-1]; 188 } 189 190 TreeNode * find_first_father(TreeNode *root,TreeNode * p,TreeNode *q) 191 { 192 dfs(root,p,pathp,&pnum); 193 f = 0; 194 dfs(root,q,pathq,&qnum); 195 TreeNode * first_father = find_last_same_node(); 196 return first_father; 197 // printf("%d\n",first_father->data); 198 } 199 200 int main() 201 { 202 203 node[0].data = 0; 204 node[0].left = &node[1]; 205 node[0].right = &node[2]; 206 node[1].data = 1; 207 node[1].left = &node[3]; 208 node[1].right = &node[4]; 209 node[2].data = 2; 210 node[2].left = &node[5]; 211 node[2].right = &node[6]; 212 node[3].data = 3; 213 node[3].left = &node[7]; 214 node[3].right = NULL; 215 node[4].data = 4; 216 node[4].left = &node[8]; 217 node[4].right = NULL; 218 node[5].data = 2; 219 node[5].left = &node[9]; 220 node[5].right = &node[10]; 221 node[6].data = 6; 222 node[6].left = NULL; 223 node[6].right = NULL; 224 node[7].data = 7; 225 node[7].left = NULL; 226 node[7].right = NULL; 227 node[8].data = 8; 228 node[8].left = NULL; 229 node[8].right = NULL; 230 node[9].data = 5; 231 node[9].left = NULL; 232 node[9].right = NULL; 233 node[10].data = 9; 234 node[10].left = NULL; 235 node[10].right = NULL; 236 237 node1[0].data = 2; 238 node1[0].left = &node1[1]; 239 node1[0].right = &node1[2]; 240 node1[1].data = 2; 241 node1[1].left = NULL; 242 node1[1].right = NULL; 243 node1[2].data = 6; 244 node1[2].left = NULL; 245 node1[2].right = NULL; 246 247 preorder(root1); 248 // printf("\n"); 249 // preorder(root2); 250 // printf("\n"); 251 252 // printf("%d\n",compare(root1,root2)); 253 println(); 254 preorder_loop(root1); 255 println(); 256 println(); 257 inorder(root1); 258 println(); 259 inorder_loop(root1); 260 println(); 261 println(); 262 postorder(root1); 263 println(); 264 postorder_loop(root1); 265 println(); 266 println(); 267 TreeNode * first_father = find_first_father(root1,&node[6],&node[9]); 268 printf("%d\n",first_father->data); 269 return 0; 270 }