擴充套件問題
問題1.給定前序遍歷結果和中序遍歷結果,重建二叉樹
遞迴構造就可以了。
tree* create_by_order(int* pre,int* in,int問題2.二叉樹映象size)
int i=0
; tree* rt = malloc(sizeof
(tree));
rt->value = pre[0
];//在中序中查詢根節點位置
while(i
else
}rt->left = create_by_order(pre+1,in
,i);
rt->right = create_by_order(pre+1+i,in+i+1,size-i-1
);
return
rt;}
tree* mirror(tree*rt)問題3.求二叉樹節點最大距離return
rt;}
分三種情況
情況1.如第乙個圖所示,左深度加上右深度
情況2.如第二個圖所示,左子樹中節點的最大距離
情況3.將圖二映象一下,右子樹中節點的最大距離
最後結果就是求這三個中較大的。
int depth(tree*rt)問題4.求兩個節點的最近公共父節點(沒有指向父節點指標,樹為一般二叉樹)return0;
}int max(int a,int b,int
c)
if(b>a&&b>c)
if(c>a&&c>a)
return a;
}int max_distance(tree*rt)
return0;
}
分三種情況
1.如果p1,p2節點分別在root->left,root->right,那麼root為p1,p2的祖先
2.如果p1,p2都在root->left,那邊將root=root->left 轉換為子問題
3.如果p1,p2都在root->right, 那麼將root=root->right 轉換為字問題
/*擴充套件,如果樹是搜尋樹時**** 查詢樹中包含某個節點 **/
int contains(tree* rt,const tree*p)
if(rt==null)
return contains(rt->left,p)||contains(rt->right,p);}/*
**** 查詢p1和p2的最近公共父節點 **/
tree* get_same_parent(tree* rt,const tree* p1,const tree*p2)
if(p1!=null&&p2!=null)
if( right_contains_p1 &&right_contains_p2 )
return
rt; }
}
1.p1,p2小於root,root=root->left
2.p1,p2大於root, root=root->right
3.p1,p2在root兩邊,root為p1,p2的最近公共父節點
stree* get_same_parent(stree* rt,stree* p1,stree*p2)擴充套件,一般樹if( rt->value > p1->value && rt->value > p2->value )
if( rt->value < p1->value && rt->value < p2->value )
return
rt;}
方法1.
用兩個鍊錶儲存從根節點到p1,p2的路徑。然後將問題轉換為兩個鍊錶求交集問題。
方法2.
**:問題5.二叉查詢樹的刪除
待刪除節點是葉子節點,直接刪除
待刪除節點只有左子樹或者只有右子樹 ,將左(右)子樹節點位置替換到待刪除節點位置
待刪除節點既有左子樹又有右子樹,遍歷到待刪除節點的最左下節點位置,也就是找到乙個比待刪除節點小,但是小得最少的,然後將這個節點替換到待刪除節點位置
c語言寫著還挺帶感
#include#define null 0struct
tree;
typedef
struct
tree tree;
tree*root;
tree* insert_rcs(tree* root, int
value)
if(root->value >value)
else
return
root;
}tree* insert_no_rcs(tree* root, int
value)
//p為工作指標
tree* p =root;
//p節點是插入節點,pre節點時插入節點的父節點
tree*pre;
while
(p)else
}if(pre->value > newnode->value)
else
return
root; }//
前序遍歷
void pre_print_rcs(tree*root)
}tree* stack[20
];int top = -1;//
前序遍歷 非遞迴
void pre_print_no_rcs(tree*root)
}else
}}//
中序遍歷
void in_print_rcs(tree*root)}//
中序遍歷 非遞迴
void in_print_no_rcs(tree*root)
}else
} }//
後序遍歷
void post_print_rcs(tree*root)
}tree* q[20
];int
front;
intrear;
//層序遍歷
//輸出隊頭元素,並將左右子樹如佇列
void level_print(tree*root)
if(p->right != null
) }
}}tree* create_no_rcs(int* list, int
n)
return
root;
}tree* create_rcs(int* list, int
n)
return
root;
}int
main();
//root = create_no_rcs(list, 10);
root = create_rcs(list, 10
);
//pre_print_rcs(root);
//pre_print_no_rcs(root);
in_print_rcs(root);
in_print_no_rcs(root);
//post_print_rcs(root);
//level_print(root);
return0;
}
二叉樹的前序中序遞迴,非遞迴遍歷
二叉樹的前序,中序 遞迴,非遞迴遍歷 例如 二叉樹 6 14 4 8 12 16 前序遍歷的結果為 10 6 4 8 14 12 16 思路 非遞迴方法 先壓入根節點10 同時輸出資料 10 然後判斷 10有左子樹沒有,如果有則繼續壓入6 輸出 6 判斷6有沒有左子樹,如果有壓入 4,輸出 4.判斷...
二叉樹的遍歷 前序非遞迴和中序非遞迴
詳情可以見文章二叉樹建立和遞迴遍歷 建立如圖的二叉樹 就可以建立好上圖的二叉樹 非遞迴遍歷的演算法如下 include include using namespace std typedef char datatype 二叉樹的左右鏈表示,也叫做二叉鍊錶表示 typedef struct node ...
前序中序後序遍歷遞迴非遞迴實現
根 左兒子 右兒子 definition for binary tree struct treenode void preorder treenode root,vector v 非遞迴遍歷時就是模擬棧,注意入棧順序即可 void preorder treenode root,vector v 左二...