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個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...