簡單的樹的遞迴 非遞迴建立,前序中序後序遍歷

2021-06-26 06:00:26 字數 3908 閱讀 7669

擴充套件問題

問題1.給定前序遍歷結果和中序遍歷結果,重建二叉樹

遞迴構造就可以了。

tree* create_by_order(int* pre,int* in,int

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;}

問題2.二叉樹映象

tree* mirror(tree*rt)

return

rt;}

問題3.求二叉樹節點最大距離

分三種情況

情況1.如第乙個圖所示,左深度加上右深度

情況2.如第二個圖所示,左子樹中節點的最大距離

情況3.將圖二映象一下,右子樹中節點的最大距離

最後結果就是求這三個中較大的。

int depth(tree*rt)

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;

}

問題4.求兩個節點的最近公共父節點(沒有指向父節點指標,樹為一般二叉樹)

分三種情況

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 0

struct

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 左二...