考研 東北大學二叉樹相關演算法 1

2021-07-25 20:57:06 字數 2587 閱讀 6300

void inthread(threadtree &p,threadtree &pre)

if(pre!=null&&pre->rchild==null)

pre=p;

inthread(p->rchild,pre);

}}void creatintread(threadtree

t)}

elemtype

comm_ancestor(sqtree

t,int i,int j)

return

t[i];

}}

int btdepth(bitree

t) return level;

}}

解題思想:

根據完全二叉樹的定義,具有n個結點的完全二叉樹與滿二叉樹中編號1–n的結點一一對應。

採用層次遍歷的演算法,將所有結點加入佇列(包括空結點),當遇到空結點時,檢視其後是否有非空結點,若有,則二叉樹不是完全二叉樹。

bool iscomplete(bitree &t)

else 結點為空,檢查其後是否有非空結點

}return

1; }

}

int dsonnodes(bitree &t)

解題思路:

設定乙個全域性變數i記錄已訪問過的結點序號,其初值是根結點在先序序列中的序號,即為1,。

當二叉樹為空時返回特殊字元『#』。

當i=k時,小時豪到滿足條件的結點。返回b->data;

當i!=k時,則遞迴地在左子樹中查詢,若找到了則返回該值,否則繼續遞迴地在右子樹中查詢,並返回其結果

int i=1;

elemtype

prenode(bitree b,int k)

演算法思想:採用非遞迴後序遍歷,最後訪問根節點,當訪問之為x的結點時,棧中所有元素均為該結點的祖先,依次出棧列印即可

typedef struct

stack tag=0表示左子樹被訪問,tag=1時表示右子女被訪問

void search(bitree bt,elemtype x)

if(bt->data==x)

while(top!=0&&s[top].tag==1)

top--;

if(top!=0)

}}

演算法思想:

採用後續非遞迴遍歷演算法,棧中存放二叉樹結點的指標,當訪問到某結點時,棧中所有元素均為該結點的祖先,後續遍歷必然先遍歷到結點p,棧中元素均為p的忑結點,先將棧複製到另一塊輔助棧中去,繼續遍歷到結點q時,將棧中元素從棧頂開始逐個到輔助棧中去匹配,第乙個匹配到的元素即結點p與q的公共最近祖先。

typedef struct

srack;

stack s1,s2;

bitree

ancestor(bitree

root,bitnode *p,bitnode *q)

while(top!=0&&s[top].tag==1)

if(s[top].t==q)

top--;

}if(top!=0)}}

}

採用層次遍歷,求出所有結點的層次,並將所有結點與對應的層次放在乙個佇列中,然後通過掃瞄佇列求出各層的結點總數即二叉樹的寬度

typedef struct

qu;int btwidth(bitree b)

if(p->rchild!=null)

max=0;

i=0;k=1;

while(i<=qu.rear)

k=qu.level[i];

if(n>max)

max=n;

}return max;

}}

演算法思想:

通常我們所使用的先序,中序和後續遍歷對於葉結點的訪問都從左到右排序,這裡我們採用中序遍歷遞迴演算法。

設前驅結點指標pre,初始為空,第乙個葉結點由指標head指向,遍歷到葉結點時,就將它的前驅rchild指向它,最後乙個葉結點rchild為空

linklist head,pre=null;

linklist

inorder(bitree bt)

else

inorder(bt->rchild);

pre->rchild=null;

}return head;

}}

int similar(bitree

t1,bitree

t2)}

二叉樹相關演算法

節點 class node t public node t left public node t right public node t value,node t left,node t right public node t value this value,null null 二叉樹 前中後深度...

二叉樹相關演算法 二

leetcode 437.path sum iii 第乙個想法就是遍歷二叉樹,找出每個節點的可能性。這個思路時間複雜度為o n 2 private int num public intpathsum treenode root,int sum private void recur treenode ...

二叉樹的相關演算法

二叉樹 二叉查詢樹 是這樣一類的樹,父節點的左邊孩子的key都小於它,右邊孩子的key都大於它。二叉樹在查詢和儲存中通常能保持logn的查詢 插入 刪除,以及前驅 後繼,最大值,最小值複雜度,並且不占用額外的空間。include includeusing namespace std class tr...