如果給定一棵二叉樹,要找到二叉樹中的所有眾數(出現頻率最高的元素)。
一、普通二叉樹的眾數
要統計出現的次數,一般使用到的是map中的unordered_map,因為不需要有序,也不需要有重複的元素,其key值一般是元素的值,value一般是元素出現的次數,這個只要遍歷一遍二叉樹就能得到unordered_map了;
關鍵是遍歷得到它之後怎樣做處理:
1 得到的map裡放的是key(元素)和value(元素出現的個數),是按照二叉樹遍歷的順序放進去的,如果不是二叉搜尋樹的中序遍歷,那就是無序的,要在這個無序的map中找到出現頻率最高的key(元素),也就是找到value值最大的所有元素,以下我總結幾種方法,其實懂的人可能覺得很簡單,因為我對於map的迭代操作不熟練,所以用來記錄一下,勿怪。
(1)我們新建立乙個vector>,用map初始化它,然後我們需要先遍歷一遍這個vector,找到value的最大值,再遍歷一遍,找到這個value對應的所有元素放進結果集中。
/** * definition for a binary tree node.
* struct treenode
* }; */
class
solution
public
: vector
findmode(treenode*root)
//以上得到了value的最大值
for (int i=0; i)
return
result;
}};
(2)直接用map迭代器進行迭代
/** * definition for a binary tree node.
* struct treenode
* }; */
class
solution
public
: vector
findmode(treenode*root)
//以上得到了value的最大值
for (it = map.begin(); it != map.end(); it++)
return
result;
}};
2 得到的map是key 和 value一一對應的,我們可以建立vector>來將map複製過來,然後對這個vector進行sort排序,按照value從大到小的順序排序,排序好之後,value最大也就是出現次數最多的元素肯定排在前面,遍歷一次,將他們加入結果集即可。
/** * definition for a binary tree node.
* struct treenode
* }; */
class
solution
bool
static cmp(const pair& a, const pair&b)
public
: vector
findmode(treenode*root)
return
result;
}};
二、求二叉搜尋樹中的所有眾數
二叉搜尋樹也是普通的二叉樹,當前可以按照普通二叉樹的思路和方法求解,但是二叉搜尋樹具有 中序遍歷 有序的特性,應用這個特性,能找到更高效的方法。
可以通過一次遍歷得到結果,需要pre指標來記錄前乙個節點,需要count來統計頻率,需要maxcount來表示最大頻率,還需要乙個結果集在存放結果。因為是全部遍歷,所以遞迴函式不需要返回值
/** * definition for a binary tree node.
* struct treenode
* }; */
class
solution
if (count > maxcount)
searchbst(root->right);//
右return
; }
public
: vector
findmode(treenode*root)
};
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
二叉樹問題 二叉樹層級列印
給定二叉樹的頭結點,按層級列印二叉樹節點值。從上到下按層遍歷,應該是先遍歷到的節點先輸出。因此用佇列作為輔助結構來解此題。層級遍歷中關鍵點要知道什麼時候換層。用兩個變數last 和nlast,分別指向當前層的最右邊和下一層的最右邊節點。當當前層的最右邊節點從佇列中輸出時,表示這一層遍歷完畢了,此時使...
二叉樹問題
mirror of search tree.cpp 定義控制台應用程式的入口點。二叉樹的映象實現,二叉樹的廣度優先遍歷 佇列 include stdafx.h include iostream include queue using namespace std struct bstnode temp...