二叉樹(補充)

2021-07-11 18:37:21 字數 2511 閱讀 6023

1.二叉樹的下乙個節點

給定乙個二叉樹和其中的乙個結點,請找出中序遍歷(左,根,右)順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。

2)當前節點的右子樹不存在且當前節點是其父節點的左子節點,則其父節點就是下一節點。

3)當前節點的右子樹不存在且當前節點是其父節點的右子節點,則一直向上遍歷,尋找乙個節點是這個節點父節點的左子節點,則這個父節點就是下一節點。

struct treelinknode 

};

treelinknode* getnext(treelinknode* pnode)

else

node=node->next; }}

}return result;

}

2.對稱的二叉樹

判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。

bool issymmetrical(treenode* proot)

bool issame(treenode* root1,treenode* root2)

3.按之字形順序列印二叉樹

按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

思路:將樹的層次,按奇偶分開,偶數層從左到右列印,奇數層從右到左列印。

列印某一層節點的同時要儲存下一層的節點。這裡用兩個stack q,p分別儲存偶數,奇數層。

奇數層節點壓棧,由左到右壓;偶數層壓棧,由右到左壓。這樣出棧的時候剛好相反。

vector> print(treenode* proot) 

}else

}result.push_back(temp);

temp.clear();

++index;

}return result;

}

4.把二叉樹列印成多行

從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

思路:基本和上題一樣,也是按奇偶分層,只不過每層都是從左到右列印。這裡用兩個佇列queue(隊尾進隊首出)儲存奇偶層節點。每層節點進隊的順序從左到右,這樣出隊時剛好也是從左到右。

vector> print(treenode* proot) 

else

while(!p.empty())

result.push_back(temp);

temp.clear();

++index;

}return result;

}

5.二叉搜尋樹的第k個結點

給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。

思路:按節點大小順序尋找,肯定是中序遍歷。先是左子樹中尋找,然後是根節點,最後是右子樹中尋找。是乙個遞迴的過程。這裡用乙個整型變數k來記錄遍歷到了第乙個節點。當k變成1時,剛好是第k個順序節點。

treenode* kthnode(treenode* proot, unsigned int k)

treenode* findknode(treenode* proot, unsigned int &k)

if(!result)

result=findknode(proot->right,k);//右子樹中尋找

return result;

}

6. 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。

思路:考慮到時間複雜度的原因,我們這裡不用常規的排序演算法。

這裡借助兩個堆結構(最小堆和最大堆)來存放資料。為了尋找中位數,必須保證兩個堆的大小之差不能超過1,這樣通過兩個堆頂的元素就可以求得中位數。

當已有總元素個數是偶數時,新元素壓入最小堆;奇數時,壓入最大堆。

為了保證每次壓堆後,最小堆中的元素都大於最大堆的元素,壓堆的時候需做適當的元素調整。

class solution 

min.push_back(num);

push_heap(min.begin(),min.end(),greater());

}else

max.push_back(num);

push_heap(max.begin(),max.end(),less());}}

double getmedian()

private:

vectormin;//小頂堆,最小堆

vectormax;//大頂堆

};

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...